{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "b4y332mk37T4"
      },
      "source": [
        "对应 `tf.keras` 的01~02章节"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T01:29:26.541293Z",
          "start_time": "2025-01-15T01:29:18.919142Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "V-sX_tpI37T5",
        "outputId": "8a604540-55fd-4e37-e333-4564630db076"
      },
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=10, micro=12, releaselevel='final', serial=0)\n",
            "matplotlib 3.8.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "execution_count": 2
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "784"
            ]
          },
          "metadata": {},
          "execution_count": 3
        }
      ],
      "source": [
        "28*28"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:30.417590400Z",
          "start_time": "2024-07-17T03:06:30.410095400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mGoe0F3437T7",
        "outputId": "de031ca1-da94-48d9-9e4f-a287e4faa294"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a-0yV-ZH37T7"
      },
      "source": [
        "## 数据准备1，为了看灰度图片"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:06.382299Z",
          "start_time": "2025-01-15T02:13:06.356673Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SajGTLZH37T7",
        "outputId": "67243b8f-bff4-4dea-9954-7086931a0642"
      },
      "source": [
        "from torchvision import datasets\n",
        "from torchvision.transforms import ToTensor\n",
        "from torchvision import transforms\n",
        "\n",
        "\n",
        "# 定义数据集的变换\n",
        "transform = transforms.Compose([\n",
        "])\n",
        "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
        "train_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "test_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "# torchvision 数据集里没有提供训练集和验证集的划分\n",
        "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 26.4M/26.4M [00:00<00:00, 116MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 29.5k/29.5k [00:00<00:00, 5.72MB/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\n",
            "100%|██████████| 4.42M/4.42M [00:00<00:00, 67.3MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 5.15k/5.15k [00:00<00:00, 5.88MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n"
          ]
        }
      ],
      "execution_count": 4
    },
    {
      "cell_type": "code",
      "source": [
        "type(train_ds)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:08.733474Z",
          "start_time": "2025-01-15T02:13:08.730609Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        },
        "id": "kIYbjy2j37T8",
        "outputId": "3c072c51-5737-408d-b9fc-a2737d315c63"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torchvision.datasets.mnist.FashionMNIST"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>torchvision.datasets.mnist.FashionMNIST</b><br/>def __init__(root: Union[str, Path], train: bool=True, transform: Optional[Callable]=None, target_transform: Optional[Callable]=None, download: bool=False) -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/torchvision/datasets/mnist.py</a>`Fashion-MNIST &lt;https://github.com/zalandoresearch/fashion-mnist&gt;`_ Dataset.\n",
              "\n",
              "Args:\n",
              "    root (str or ``pathlib.Path``): Root directory of dataset where ``FashionMNIST/raw/train-images-idx3-ubyte``\n",
              "        and  ``FashionMNIST/raw/t10k-images-idx3-ubyte`` exist.\n",
              "    train (bool, optional): If True, creates dataset from ``train-images-idx3-ubyte``,\n",
              "        otherwise from ``t10k-images-idx3-ubyte``.\n",
              "    download (bool, optional): If True, downloads the dataset from the internet and\n",
              "        puts it in root directory. If dataset is already downloaded, it is not\n",
              "        downloaded again.\n",
              "    transform (callable, optional): A function/transform that  takes in a PIL image\n",
              "        and returns a transformed version. E.g, ``transforms.RandomCrop``\n",
              "    target_transform (callable, optional): A function/transform that takes in the\n",
              "        target and transforms it.</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 203);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "execution_count": 5
    },
    {
      "cell_type": "code",
      "source": [
        "len(train_ds)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:11.750565Z",
          "start_time": "2025-01-15T02:13:11.747604Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uQB0jotK37T8",
        "outputId": "e545ea6a-b79a-4989-aefd-6a2e33d282a9"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "60000"
            ]
          },
          "metadata": {},
          "execution_count": 6
        }
      ],
      "execution_count": 6
    },
    {
      "cell_type": "code",
      "source": [
        "type(train_ds[0])"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:13.594811Z",
          "start_time": "2025-01-15T02:13:13.591838Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "89kojR5s37T8",
        "outputId": "18a38cb0-b9f4-422f-ff4f-c13e442d1db2"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "tuple"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ],
      "execution_count": 7
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:21.371514Z",
          "start_time": "2025-01-15T02:13:21.368524Z"
        },
        "id": "4AwHu6gr37T9"
      },
      "source": [
        "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
        "img, label = train_ds[0]"
      ],
      "outputs": [],
      "execution_count": 8
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:23.638090Z",
          "start_time": "2025-01-15T02:13:23.635545Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 186
        },
        "id": "FcRQI8bn37T9",
        "outputId": "ce959be3-bb2f-4f0d-bff0-e81b758f391e"
      },
      "cell_type": "code",
      "source": [
        "type(img) #tensor中文是 张量,和numpy的ndarray类似"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "PIL.Image.Image"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>PIL.Image.Image</b><br/>def __init__() -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/PIL/Image.py</a>This class represents an image object.  To create\n",
              ":py:class:`~PIL.Image.Image` objects, use the appropriate factory\n",
              "functions.  There&#x27;s hardly ever any reason to call the Image constructor\n",
              "directly.\n",
              "\n",
              "* :py:func:`~PIL.Image.open`\n",
              "* :py:func:`~PIL.Image.new`\n",
              "* :py:func:`~PIL.Image.frombytes`</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 533);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 9
        }
      ],
      "execution_count": 9
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-14T08:16:50.708516Z",
          "start_time": "2025-01-14T08:16:50.682030Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 45
        },
        "id": "0sij3J2S37T9",
        "outputId": "cd7de313-14cc-4723-b199-7781553b0406"
      },
      "cell_type": "code",
      "source": [
        "img"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<PIL.Image.Image image mode=L size=28x28>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACD0lEQVR4AbWRz2sTQRTH38zszm42k6Q2TU2ixURstRdRasWC9FCsUE9SpIKnKl48+x94UOjNiyf/h4KgKN7TYgNKK+agjZS0wZDYbND90dn54VqxIWfxXebBB97nfecB/P9CAKkFAGT8ViEEh+9fLZZn7gde+E4AwkgAGYBEzl3btZz55y0tgSl/AHKYLhH85uJKdat2ebqyFmuOCun5laFIwcYXjvLRxq1nfRh3er0ESHAI1fvPYqF8oj9WxxO6hcAyWZhQV2fw6OvBbcEh2O/tlxTCjlRjgPtGAqwYcpN7GWUlPbppXepDTeB2AduQHONWpOzsi09GHxocPobUccZPh8RhcvfOy/V4IUQwigMIgFdeQHWb2BFEipzvxU6iBT9QALNPq8F3oYTnSRt8oN4iHOYcLk4UFs+GOEo0TZrlToXNqp7ZmkQw8yg3JIkrHI6C2lI1dawE9dQPP8HSDiJrRSF9IAFAZmT5+oNm+LU+nuVmispT6N6TbcYsMDONZg7nb9rl5NQU5pgCMq8YrUY6bDCa3t9hQShWt0rD3I0kNxWiE8aebiRH3E7bsEw7hTuTXqNrdSIRJfK9C8aH1bvNesioTcmB1P43JY2QcdeNRLkVR7nx8HjblYQaBGnTpCYC1AKq8ptLCMf55x6PZjAxJGrpPfWTgI58/LZW+fMJ8WXO5bond/j20Y3+sfkFaCTYdrBYeB0AAAAASUVORK5CYII=\n",
            "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q==\n"
          },
          "metadata": {},
          "execution_count": 10
        }
      ],
      "execution_count": 10
    },
    {
      "cell_type": "code",
      "source": [
        "type(img)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:39.174388Z",
          "start_time": "2025-01-15T02:13:39.171790Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 186
        },
        "id": "6WEm5Wca37T9",
        "outputId": "f1bcc00c-f0cd-4f16-bd5d-601e819c6c45"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "PIL.Image.Image"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>PIL.Image.Image</b><br/>def __init__() -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.10/dist-packages/PIL/Image.py</a>This class represents an image object.  To create\n",
              ":py:class:`~PIL.Image.Image` objects, use the appropriate factory\n",
              "functions.  There&#x27;s hardly ever any reason to call the Image constructor\n",
              "directly.\n",
              "\n",
              "* :py:func:`~PIL.Image.open`\n",
              "* :py:func:`~PIL.Image.new`\n",
              "* :py:func:`~PIL.Image.frombytes`</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 533);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 11
        }
      ],
      "execution_count": 11
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "9"
            ]
          },
          "metadata": {},
          "execution_count": 12
        }
      ],
      "source": [
        "label"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:33.599820400Z",
          "start_time": "2024-07-17T03:06:33.545914600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "b-mg1eOQ37T-",
        "outputId": "01bf405a-3182-4e60-bafa-bbece37b93b2"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
        "def show_img_content(img):\n",
        "    from PIL import Image\n",
        "\n",
        "    # 打开一个图像文件\n",
        "    # img = Image.open(img)\n",
        "\n",
        "\n",
        "    print(\"图像大小:\", img.size)\n",
        "    print(\"图像模式:\", img.mode)\n",
        "\n",
        "\n",
        "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
        "    if img.mode == 'L':\n",
        "        pixel_values = list(img.getdata())\n",
        "        print(pixel_values)\n",
        "show_img_content(img) #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:50.749937Z",
          "start_time": "2025-01-15T02:13:50.747354Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "nsaOZlGy37T-",
        "outputId": "b58e9ae8-05cf-4237-e049-120a7df2b649"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "图像大小: (28, 28)\n",
            "图像模式: L\n",
            "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
          ]
        }
      ],
      "execution_count": 13
    },
    {
      "cell_type": "code",
      "source": [
        "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
        "def show_single_image(img_arr):\n",
        "    plt.imshow(img_arr, cmap=\"binary\") # 显示图片\n",
        "    plt.colorbar() # 显示颜色条\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "show_single_image(img)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:13:52.822873Z",
          "start_time": "2025-01-15T02:13:52.763338Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 430
        },
        "id": "2v1gMyNt37T-",
        "outputId": "d2c2bac9-55be-4909-ffdf-851d261ee406"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAGdCAYAAADtxiFiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAw/UlEQVR4nO3de3BUdZr/8Q8J5AZJY4CkkyGwAS+AXHQRQrywKFmSYLGiqS1RZgosCko2sQZSipspBbxUZYexRksXoXbWAd01jlojWFJWRgQJQ5EwklmKQZ0I2TCEgg6KlTQJ5kLSvz/4pdeWW74nnXS+nPer6lSlu8/T55uTkzx5vuf0eQYFAoGAAACAVaIiPQAAAGCOBA4AgIVI4AAAWIgEDgCAhUjgAABYiAQOAICFSOAAAFiIBA4AgIUGR3oAP9bV1aVTp04pMTFRgwYNivRwAACGAoGAzp07p/T0dEVF9V2d2Nraqvb29l6/T0xMjOLi4sIwov414BL4qVOnlJGREelhAAB6qb6+XqNHj+6T925tbVV8fHxY3svr9aqurs66JD7gEnhiYqKkiz/4pKSkCI8GAGDK7/crIyMj+Pe8L4Sj8u7m8/nU3t5OAu+2ceNG/epXv5LP59O0adP02muvaebMmdeM6542T0pKIoEDgMX66zRob7ZjczuQPjk58e6776q4uFjr1q3Tn//8Z02bNk25ubk6c+ZMX2wOAOBSgwYN6vViorS0VDNmzFBiYqJSUlK0cOFC1dTUhKwzZ86cS7bx+OOPh6xz4sQJ3X///UpISFBKSoqeeuopXbhwwWgsfZLAf/3rX2v58uV67LHHNGnSJG3evFkJCQn67W9/2xebAwC4VH8n8IqKChUWFqqqqko7d+5UR0eH5s2bp5aWlpD1li9frtOnTweXDRs2BF/r7OzU/fffr/b2du3fv19vvvmmtm7dqrVr1xqNJexT6O3t7aqurlZJSUnwuaioKOXk5KiysvKS9dva2tTW1hZ87Pf7wz0kAMB1ykkS7o3y8vKQx1u3blVKSoqqq6s1e/bs4PMJCQnyer2XfY9PPvlEX375pT799FOlpqbqtttu0wsvvKCnn35a69evV0xMTI/GEvYK/Ntvv1VnZ6dSU1NDnk9NTZXP57tk/dLSUnk8nuDCFegAgP7m9/tDlh8WllfT1NQkSUpOTg55/u2339bIkSM1efJklZSU6Pz588HXKisrNWXKlJA8mZubK7/fry+++KLHY474jVxKSkrU1NQUXOrr6yM9JACAJcI1hZ6RkRFSTJaWll5z211dXVq1apXuuusuTZ48Ofj8o48+qv/+7//WZ599ppKSEv3Xf/2XfvrTnwZf9/l8ly1yu1/rqbBPoY8cOVLR0dFqaGgIeb6hoeGy0wmxsbGKjY0N9zAAAC4Qrin0H390uSd5qbCwUEeOHNG+fftCnl+xYkXw6ylTpigtLU1z585VbW2txo8f3+uxdgt7BR4TE6Pp06dr165dwee6urq0a9cuZWdnh3tzAAD0WvdHl7uXayXwoqIi7dixQ5999tk1b1aTlZUlSTp27JikizeOuVyR2/1aT/XJFHpxcbF+85vf6M0339RXX32llStXqqWlRY899lhfbA4A4FL9fRV6IBBQUVGRtm3bpt27dyszM/OaMYcOHZIkpaWlSZKys7P1l7/8JeSj1Tt37lRSUpImTZrU47H0yY1cHn74YX3zzTdau3atfD6fbrvtNpWXl18y5w8AQG/091XohYWFKisr04cffqjExMTgOWuPx6P4+HjV1taqrKxM8+fP14gRI3T48GGtXr1as2fP1tSpUyVJ8+bN06RJk/Szn/1MGzZskM/n0zPPPKPCwkKjU8qDAgPsNjR+v18ej0dNTU3ciQ0ALNQff8e7txEbG9vrO7G1tbX1eKxX2taWLVu0dOlS1dfX66c//amOHDmilpYWZWRk6MEHH9QzzzwT8v5/+9vftHLlSu3Zs0dDhw7VkiVL9G//9m8aPLjndTUJHAAQVv2ZwOPi4nqdwFtbW63MOQOumQkAAD3V31PoA0nEPwcOAADMUYEDAKzl5gqcBA4AsBYJHAAAC7k5gXMOHAAAC1GBAwCs5eYKnAQOALCWmxM4U+gAAFiIChwAYC03V+AkcACAtdycwJlCBwDAQlTgAABrubkCJ4EDAKzW225ktmIKHQAAC1GBAwCs1dspdJun30ngAABrkcABALCQmxM458ABALAQFTgAwFpursBJ4AAAa7k5gTOFDgCAhajAAQDWcnMFTgIHAFjLzQmcKXQAACxEBQ78gJP7IvfXf/Dnzp0zjtm3b5+jbeXn5zuKM+Vkf3d2dhrHDB58/f2p6897eA/kKtXNFfj1d1QDAFzDzQmcKXQAACxEBQ4AsJabK3ASOADAWiRwAAAs5OYEzjlwAAAsRAUOALCWmytwEjgAwFpuTuBMoQMAYCEqcACAtdxcgZPAAQDWcnMCZwodAAALUYEDP9DV1WUcEx0dbRxz7Ngx45j//M//NI6Jj483jpGkoUOHGsfExcUZx8ycOdM4pj8bkzhpGOLkGHKynf7cD6YNZJw0nHHKzRU4CRwAYDWbk3BvMIUOAICFqMABANZiCh0AAAuRwAEAsJCbEzjnwAEAsBAVOADAWm6uwEngAABruTmBM4UOAICFqMABANZycwVOAgcAWMvNCZwpdAAALEQFDvyAkyYMTpqZ7N692zhm586dxjEZGRnGMZLU1tZmHHP+/HnjmE8++cQ4Zvny5cYxqampxjGSs+rMyfHgRHNzs6O4qCjzui0hIcFo/f7aB5K7K3ASOADAWm5O4EyhAwBgobAn8PXr1wf/I+peJkyYEO7NAABwSb5xstiqT6bQb731Vn366af/t5F+bDwPAHAPN0+h90lmHTx4sLxeb1+8NQAAQW5O4H1yDvzo0aNKT0/XuHHjtHjxYp04ceKK67a1tcnv94csAADg6sKewLOysrR161aVl5dr06ZNqqur0z333KNz585ddv3S0lJ5PJ7g4vRjLwAA93HzOfCwJ/D8/Hz98z//s6ZOnarc3Fx9/PHHamxs1HvvvXfZ9UtKStTU1BRc6uvrwz0kAMB1ys0JvM+vLhs+fLhuvvlmHTt27LKvx8bGKjY2tq+HAQDAdaXPPwfe3Nys2tpapaWl9fWmAAAu098VeGlpqWbMmKHExESlpKRo4cKFqqmpCVmntbVVhYWFGjFihIYNG6aCggI1NDSErHPixAndf//9SkhIUEpKip566ilduHDBaCxhT+BPPvmkKioqdPz4ce3fv18PPvigoqOj9cgjj4R7UwAAl+vvBF5RUaHCwkJVVVVp586d6ujo0Lx589TS0hJcZ/Xq1froo4/0/vvvq6KiQqdOndJDDz0UfL2zs1P333+/2tvbtX//fr355pvaunWr1q5dazSWsE+hnzx5Uo888ojOnj2rUaNG6e6771ZVVZVGjRoV7k0BANCvysvLQx5v3bpVKSkpqq6u1uzZs9XU1KQ33nhDZWVluu+++yRJW7Zs0cSJE1VVVaVZs2bpk08+0ZdffqlPP/1Uqampuu222/TCCy/o6aef1vr16xUTE9OjsYQ9gf/ud78L91sC/aanvzi99fnnnxvHHD9+3Dimq6vLOMZp3Lx584xj/ud//sc4Zs2aNcYxd9xxh3GMJE2ZMsU4ZuLEicYxf/rTn4xjnBxDknTnnXcax2RnZxut358fBw7X58B/POaeXp/V1NQkSUpOTpYkVVdXq6OjQzk5OcF1JkyYoDFjxqiyslKzZs1SZWWlpkyZEtJkJzc3VytXrtQXX3yh22+/vUdj517oAACrhWP6PCMjI+QjzaWlpdfcbldXl1atWqW77rpLkydPliT5fD7FxMRo+PDhIeumpqbK5/MF1/lxh7zux93r9AT3OAUAuF59fb2SkpKCj3tSfRcWFurIkSPat29fXw7tikjgAABrhWsKPSkpKSSBX0tRUZF27NihvXv3avTo0cHnvV6v2tvb1djYGFKFNzQ0BG8x7vV6Lzlt0n2VusltyJlCBwBYq7+vQg8EAioqKtK2bdu0e/duZWZmhrw+ffp0DRkyRLt27Qo+V1NToxMnTgSvJcjOztZf/vIXnTlzJrjOzp07lZSUpEmTJvV4LFTgAABr9Xczk8LCQpWVlenDDz9UYmJi8Jy1x+NRfHy8PB6Pli1bpuLiYiUnJyspKUlPPPGEsrOzNWvWLEkXL/icNGmSfvazn2nDhg3y+Xx65plnVFhYaHRjMxI4AAA9tGnTJknSnDlzQp7fsmWLli5dKkl6+eWXFRUVpYKCArW1tSk3N1evv/56cN3o6Gjt2LFDK1euVHZ2toYOHaolS5bo+eefNxoLCRwAYK3+rsADgcA114mLi9PGjRu1cePGK64zduxYffzxx0bb/jESOADAWvQDBwAAVqECBwBYy80VOAkcAGAtNydwptABALAQFTiuSz25UvRynPw3vnPnTuOYgwcPGseY3CWq2w9bHJr4+uuv+yVmxowZxjE33nijcUxzc7NxjCTt37/fOOaDDz4wjhk82PxP8cyZM41jJOk3v/mNcYxpkx+nx50Tbq7ASeAAAGu5OYEzhQ4AgIWowAEA1nJzBU4CBwBYiwQOAICF3JzAOQcOAICFqMABANZycwVOAgcAWMvNCZwpdAAALEQFDgCwlpsrcBI4AMBabk7gTKEDAGAhKnAAgLXcXIGTwNGvnHYJG8ieffZZ45jTp0/3wUgudf78eUdx0dHRxjGxsbHGMfv27TOOcdLJzekf6b//+783jrnpppuMY5zs73//9383jpGk//3f/zWO+f3vf2+0vt/vN95Gb9ichHuDKXQAACxEBQ4AsBZT6AAAWIgEDgCAhdycwDkHDgCAhajAAQDWcnMFTgIHAFjLzQmcKXQAACxEBQ4AsJabK3ASOADAWm5O4EyhAwBgISpwAIC13FyBk8DRr2z+ZbmSG264wTjGSTOT+Ph445i2tjbjGEnq6OgwjmlubjaOiYuLM475/vvvjWOcHndOmq3s37/fOMZJk5+GhgbjGEnKy8tzFDdQuTmBM4UOAICFqMABANZycwVOAgcAWIsEDgCAhdycwDkHDgCAhajAAQDWcnMFTgIHAFjLzQmcKXQAACxEBQ4AsJabK3ASOADAWm5O4EyhAwBgISpwAIC13FyBk8CBXjp//rxxTGdnp3FMV1eXcYyTBiiS5PV6jWNGjBhhHHP8+HHjmKgo84lDJ81CJGc/JyfNVpx8T9HR0cYxknTy5ElHcQOVmxM4U+gAAFiIChwAYDWbq+jeMK7A9+7dqwULFig9PV2DBg3S9u3bQ14PBAJau3at0tLSFB8fr5ycHB09ejRc4wUAIKh7Cr03i62ME3hLS4umTZumjRs3Xvb1DRs26NVXX9XmzZt14MABDR06VLm5uWptbe31YAEA+CE3J3DjKfT8/Hzl5+df9rVAIKBXXnlFzzzzjB544AFJ0ltvvaXU1FRt375dixYt6t1oAQCApDBfxFZXVyefz6ecnJzgcx6PR1lZWaqsrLxsTFtbm/x+f8gCAEBPuLkCD2sC9/l8kqTU1NSQ51NTU4Ov/Vhpaak8Hk9wycjICOeQAADXMRJ4BJWUlKipqSm41NfXR3pIAAAMeGH9GFn3zR8aGhqUlpYWfL6hoUG33XbbZWNiY2MVGxsbzmEAAFyCG7mESWZmprxer3bt2hV8zu/368CBA8rOzg7npgAAcPUUunEF3tzcrGPHjgUf19XV6dChQ0pOTtaYMWO0atUqvfjii7rpppuUmZmpZ599Vunp6Vq4cGE4xw0AgKsZJ/CDBw/q3nvvDT4uLi6WJC1ZskRbt27VmjVr1NLSohUrVqixsVF33323ysvLFRcXF75RAwAgd0+hGyfwOXPmXLUxwKBBg/T888/r+eef79XAcH1y0lTCSRMPp40empubjWNOnTplHOPkuo+YmBjjmPb2duMYydn4hg4dahzT1NRkHOOkaYqThjOSs/03bNgw4xgnH5+dMmWKcYx08WZcpg4ePGi0vpPfI6dI4AAAWMjNCTziHyMDAADmqMABANaiAgcAwEKR+BjZtbpyLl269JJt5OXlhazz3XffafHixUpKStLw4cO1bNky42sHSOAAABi4VldOScrLy9Pp06eDyzvvvBPy+uLFi/XFF19o586d2rFjh/bu3asVK1YYjYMpdACAtSIxhX61rpzdYmNjg3cn/bGvvvpK5eXl+vzzz3XHHXdIkl577TXNnz9fL730ktLT03s0DipwAIC1wjWF/uOumG1tbb0a1549e5SSkqJbbrlFK1eu1NmzZ4OvVVZWavjw4cHkLUk5OTmKiorSgQMHerwNEjgAwPUyMjJCOmOWlpY6fq+8vDy99dZb2rVrl375y1+qoqJC+fn56uzslHSxc2dKSkpIzODBg5WcnHzFzp2XwxQ6AMBa4ZpCr6+vV1JSUvD53jTZWrRoUfDrKVOmaOrUqRo/frz27NmjuXPnOn7fH6MCBwBYK1xT6ElJSSFLOLtkjhs3TiNHjgz2EfF6vTpz5kzIOhcuXNB33313xfPml0MCBwCgD508eVJnz54NttnOzs5WY2Ojqqurg+vs3r1bXV1dysrK6vH7MoUOALBWJK5Cv1pXzuTkZD333HMqKCiQ1+tVbW2t1qxZoxtvvFG5ubmSpIkTJyovL0/Lly/X5s2b1dHRoaKiIi1atKjHV6BLVOAAAItF4kYuBw8e1O23367bb79d0sWunLfffrvWrl2r6OhoHT58WP/0T/+km2++WcuWLdP06dP1xz/+MWRa/u2339aECRM0d+5czZ8/X3fffbf+4z/+w2gcVODoV05+Wbqv3DThtBvZu+++axxz+vRp45hRo0YZx3z//ffGMU73g5OOVSdOnDCOGTJkiHGMk4/3DB7s7E9dR0eHcYyTn9O3335rHFNYWGgcI0mHDh0yjrlw4YLR+k5+Z3ujv2+Heq2unH/4wx+u+R7JyckqKyvr1TiowAEAsBAVOADAWm5uZkICBwBYy80JnCl0AAAsRAUOALCWmytwEjgAwFpuTuBMoQMAYCEqcACAtdxcgZPAAQDWcnMCZwodAAALUYEDAKzl5gqcBA4AsBYJHOgnpk0RJCkmJqYPRnJ5kydPNo75YYehnnLSJKM/m7qcOXPGOCYuLs44Jjk52TjGyTHkZH9Lzpq63HDDDcYxGRkZxjFOG2E89dRTxjGzZs0yWt/v9xtvwyk3J3DOgQMAYCEqcACAtdxcgZPAAQDWcnMCZwodAAALUYEDAKzl5gqcBA4AsJabEzhT6AAAWIgKHABgLTdX4CRwAIC13JzAmUIHAMBCVOAAAGu5uQIngQMArEUCd6lAIOAozklTia6uLuMYJ+MbMmSIcUxUVP+dSRk8eGAfcvn5+cYxw4YNM46Jj483jmlvbzeOcWrUqFHGMU6ajLS2thrH9GdzGyfHq5PfJyd/Uw4fPmwcI0kej8dR3EBmcxLuDc6BAwBgoYFdDgEAcBVMoQMAYCE3J3Cm0AEAsBAVOADAWm6uwEngAABruTmBM4UOAICFqMABANZycwVOAgcAWMvNCZwpdAAALEQFDgCwlpsrcBI4AMBaJPDrgJNmANHR0Y62NdAbcgxke/fuNY75/e9/bxyzb98+4xhJSkhIMI4ZMWKEcUxbW5txjJM/NE6PVSf7wcnvoJP94KQBitM/0kOHDnUUZ8pJoxqnY/vggw+MYxYsWOBoW/3BzQmcc+AAAFiIUhIAYC0qcAN79+7VggULlJ6erkGDBmn79u0hry9dujS4Q7uXvLy8cI0XAICgH+cbJ4utjBN4S0uLpk2bpo0bN15xnby8PJ0+fTq4vPPOO70aJAAACGU8hZ6fn6/8/PyrrhMbGyuv1+t4UAAA9ART6GG2Z88epaSk6JZbbtHKlSt19uzZK67b1tYmv98fsgAA0BNMoYdRXl6e3nrrLe3atUu//OUvVVFRofz8/Ct+xKS0tFQejye4ZGRkhHtIAABcd8J+FfqiRYuCX0+ZMkVTp07V+PHjtWfPHs2dO/eS9UtKSlRcXBx87Pf7SeIAgB5hCr0PjRs3TiNHjtSxY8cu+3psbKySkpJCFgAAeoIp9D508uRJnT17VmlpaX29KQAAXMN4Cr25uTmkmq6rq9OhQ4eUnJys5ORkPffccyooKJDX61Vtba3WrFmjG2+8Ubm5uWEdOAAAbp5CN07gBw8e1L333ht83H3+esmSJdq0aZMOHz6sN998U42NjUpPT9e8efP0wgsvKDY2NnyjBgBAJHAjc+bMUSAQuOLrf/jDH3o1IKecNibpL999951xzKlTp4xjvv76637ZjuSsKYKT8Tn556+rq8s4RnLWIOJqH5O8kvT0dOOYuLg445iOjg7jGElqaGgwjnHyczp//rxxzJ133mkcc+7cOeMYSfrjH/9oHBMVZX5m0uPxGMcMGTLEOEaSqqqqHMUNZDYn4d6gmQkAABaimQkAwFpMoQMAYCE3J3Cm0AEAsBAVOADAWm6uwEngAABruTmBM4UOAICFqMABANZycwVOAgcAWMvNCZwpdAAADOzdu1cLFixQenq6Bg0apO3bt4e8HggEtHbtWqWlpSk+Pl45OTk6evRoyDrfffedFi9erKSkJA0fPlzLli1Tc3Oz0ThI4AAAa0WinWhLS4umTZumjRs3Xvb1DRs26NVXX9XmzZt14MABDR06VLm5uWptbQ2us3jxYn3xxRfauXOnduzYob1792rFihVG42AKHQBgrUhMoefn5ys/P/+yrwUCAb3yyit65pln9MADD0iS3nrrLaWmpmr79u1atGiRvvrqK5WXl+vzzz/XHXfcIUl67bXXNH/+fL300ks97pVABQ4AsFa4KnC/3x+ytLW1ORpPXV2dfD6fcnJygs95PB5lZWWpsrJSklRZWanhw4cHk7ck5eTkKCoqSgcOHOjxtq6bCrx7x5hYu3ato2198803xjGNjY3GMU66GjnpwjV8+HDjGMlZB7jExETjGCddrq7WMe9q4uPjjWOcdMd69913jWNmzJhhHOP3+41jJGedz44fP+5oW6YOHz5sHGN6brHb6NGjjWOcdLRz0pWtpaXFOEbqv5+TbTIyMkIer1u3TuvXrzd+H5/PJ0lKTU0NeT41NTX4ms/nU0pKSsjrgwcPVnJycnCdnrhuEjgAwH3CNYVeX1+vpKSk4PNOCof+xhQ6AMBa4ZpCT0pKClmcJnCv1ytJamhoCHm+oaEh+JrX69WZM2dCXr9w4YK+++674Do9QQIHACBMMjMz5fV6tWvXruBzfr9fBw4cUHZ2tiQpOztbjY2Nqq6uDq6ze/dudXV1KSsrq8fbYgodAGCtSFyF3tzcrGPHjgUf19XV6dChQ0pOTtaYMWO0atUqvfjii7rpppuUmZmpZ599Vunp6Vq4cKEkaeLEicrLy9Py5cu1efNmdXR0qKioSIsWLerxFegSCRwAYLFIJPCDBw/q3nvvDT4uLi6WJC1ZskRbt27VmjVr1NLSohUrVqixsVF33323ysvLQy4Offvtt1VUVKS5c+cqKipKBQUFevXVV43GQQIHAMDAnDlzrvpJl0GDBun555/X888/f8V1kpOTVVZW1qtxkMABANZy873QSeAAAGu5OYFzFToAABaiAgcAWMvNFTgJHABgLRI4AACWsjkJ98aATeCdnZ3q7Ozs8fo///nPjbdx6tQp4xjp4k3nTTlpTOKkKYITTrvuOGn84STGiaamJkdxf/vb34xj/vVf/9U4xsl+2LRpk3FMWlqacYzkrJnJfffdZxwzfvx445ijR48ax5w9e9Y4RpKGDBliHHPhwgXjGCdNiJz8HZJ0SRMN2GvAJnAAAK6FKXQAACzk5gTOx8gAALAQFTgAwFpursBJ4AAAa7k5gTOFDgCAhajAAQDWcnMFTgIHAFjLzQmcKXQAACxEBQ4AsJabK3ASOADAWiRwAAAsRAIfgMrKyowaPjhpQjFu3DjjGElqaWkxjjl37pxxjNMGDKacNF+QnDUMGT16tHHMT37yE+OY77//3jhGklJTU41jlixZYhyzfft245gFCxYYx9TV1RnHSM6O8erqauOYzz77zDjGpMlRt9jYWOMYyVmjn/b2dkfbMuW0mYmT8dXX1xut7+TvHcwN2AQOAMC1UIEDAGAhNydwPkYGAICFqMABANZycwVOAgcAWMvNCZwpdAAALEQFDgCwlpsrcBI4AMBabk7gTKEDAGAhKnAAgLXcXIGTwAEA1iKBAwBgIRL4ADRq1CglJCT0eH0nTTKc3nDfSWOEMWPGGMc4GV9HR4dxjN/vN46RpOTkZOOYsWPHGsc42Q9xcXHGMU7joqOjjWMefPBB45gpU6YYxxw/ftw4RnLWSMfJ78Xw4cONY4YMGWIc4+RnJEkxMTHGMU6ahURFmV+OFAgEjGOcxn399ddG6ztphgNzAzaBAwDQEzZX0b1BAgcAWMvNU+hG8zalpaWaMWOGEhMTlZKSooULF6qmpiZkndbWVhUWFmrEiBEaNmyYCgoK1NDQENZBAwDgdkYJvKKiQoWFhaqqqtLOnTvV0dGhefPmhZzvWL16tT766CO9//77qqio0KlTp/TQQw+FfeAAAHRX4L1ZbGU0hV5eXh7yeOvWrUpJSVF1dbVmz56tpqYmvfHGGyorK9N9990nSdqyZYsmTpyoqqoqzZo1K3wjBwC4HlPoDjU1NUn6v6uRq6ur1dHRoZycnOA6EyZM0JgxY1RZWXnZ92hra5Pf7w9ZAADA1TlO4F1dXVq1apXuuusuTZ48WZLk8/kUExNzyUdDUlNT5fP5Lvs+paWl8ng8wSUjI8PpkAAALuPmKXTHCbywsFBHjhzR7373u14NoKSkRE1NTcGlvr6+V+8HAHAPNydwRx8jKyoq0o4dO7R3796QG6h4vV61t7ersbExpApvaGiQ1+u97HvFxsY6ugEEAABuZlSBBwIBFRUVadu2bdq9e7cyMzNDXp8+fbqGDBmiXbt2BZ+rqanRiRMnlJ2dHZ4RAwDw/1GB91BhYaHKysr04YcfKjExMXhe2+PxKD4+Xh6PR8uWLVNxcbGSk5OVlJSkJ554QtnZ2VyBDgAIOzdfhW6UwDdt2iRJmjNnTsjzW7Zs0dKlSyVJL7/8sqKiolRQUKC2tjbl5ubq9ddfD8tgAQD4IRJ4D/XkJvhxcXHauHGjNm7c6HhQkpSenq5hw4b1eH0nzQCcXvHu5Eb933zzjXGMk0YPo0aN6pcYSbpw4YJxTFtbW79sp7W11ThGkpqbm41jOjs7jWNGjBhhHPPll18ax5j8Dv2Qk+Y7N9xwg3GMk5+Tk+N18GBnd4120jjFyba+//5745grfbLnWjwej3HMoUOHjNZ3+vsHM9wLHQBgLSpwAAAs5OYE3qs7sQEAgMigAgcAWMvNFTgJHABgLTcncKbQAQCwEBU4AMBabq7ASeAAAGu5OYEzhQ4AgIWowAEA1nJzBU4CBwBYiwQOAICF3JzAOQcOAICFBmwFPnXqVCUlJfV4/QcffNB4G1u2bDGOkS52SjM1fvx445i4uDjjGCfdtNrb241jJGcdlDo6OoxjnHQjc7LvnG7LyX/wCQkJxjFpaWnGMU669ElSdHS0cYyTfeek4965c+eMY2JjY41jJGfjcxITExNjHOOkU5ok1dXVGcekpqYare/kb0Nv2FxF98aATeAAAFwLU+gAAMAqJHAAgLW6K/DeLCbWr19/SfyECROCr7e2tqqwsFAjRozQsGHDVFBQoIaGhnB/25JI4AAAi/V3ApekW2+9VadPnw4u+/btC762evVqffTRR3r//fdVUVGhU6dO6aGHHgrntxzEOXAAAAwMHjxYXq/3kuebmpr0xhtvqKysTPfdd5+kixdLT5w4UVVVVZo1a1ZYx0EFDgCwVrgqcL/fH7K0tbVdcZtHjx5Venq6xo0bp8WLF+vEiROSpOrqanV0dCgnJye47oQJEzRmzBhVVlaG/XsngQMArBWuBJ6RkSGPxxNcSktLL7u9rKwsbd26VeXl5dq0aZPq6up0zz336Ny5c/L5fIqJibnko4Spqany+Xxh/96ZQgcAuF59fX3IvUeudO+A/Pz84NdTp05VVlaWxo4dq/fee0/x8fF9Ps4fogIHAFgrXBV4UlJSyNLTm/8MHz5cN998s44dOyav16v29nY1NjaGrNPQ0HDZc+a9RQIHAFgrEleh/1Bzc7Nqa2uVlpam6dOna8iQIdq1a1fw9ZqaGp04cULZ2dm9/VYvwRQ6AMBa/X0ntieffFILFizQ2LFjderUKa1bt07R0dF65JFH5PF4tGzZMhUXFys5OVlJSUl64oknlJ2dHfYr0CUSOAAAPXby5Ek98sgjOnv2rEaNGqW7775bVVVVGjVqlCTp5ZdfVlRUlAoKCtTW1qbc3Fy9/vrrfTKWQYFAINAn7+yQ3++Xx+NRU1OTUTMTJz7++GNHcS+99JJxzJkzZ4xjug8IE04aKThteNHV1WUcc7WPZlxJZ2encYyTxhqS5OTXwcl//07G56TpjNNGNU7G119/SpxsJyUlpQ9GcnlOGvY4+R10elXz1KlTjWPee+89o/X74+949zb279+vYcOGOX6f5uZm3Xnnnf2Sc8KNChwAYC2amQAAAKtQgQMArOXmCpwEDgCwlpsTOFPoAABYiAocAGAtN1fgJHAAgLXcnMCZQgcAwEJU4AAAa7m5AieBAwCsRQIHAMBCbk7gnAMHAMBCA7YC7+rqMmqW4aQZwPz5841jnMbt3r3bOOYXv/iFcczx48eNY5qamoxjJGdNJZw0JnHSHGLwYGeHdn81ynDyX//o0aONY+Li4oxjJDlqDuHkZ9tfYmJiHMUlJCQYxzhp8vOP//iPxjETJ040jpGkO++801HcQGZzFd0bAzaBAwBwLUyhAwAAq1CBAwCs5eYKnAQOALCWmxM4U+gAAFiIChwAYC03V+AkcACAtdycwJlCBwDAQlTgAABrubkCJ4EDAKxFAgcAwEJuTuCcAwcAwEIDtgKPiopy1KBkoLrvvvuMY6qqqvpgJJf661//6ijum2++MY654YYbjGNOnjxpHDN27FjjGMlZ04vx48c72haA3nNzBT5gEzgAANfi5gR+/ZS4AAC4iFECLy0t1YwZM5SYmKiUlBQtXLhQNTU1IevMmTMn+B9R9/L444+HddAAAEi6JN84WWxllMArKipUWFioqqoq7dy5Ux0dHZo3b55aWlpC1lu+fLlOnz4dXDZs2BDWQQMAILk7gRudAy8vLw95vHXrVqWkpKi6ulqzZ88OPp+QkCCv1xueEQIAgEv06hx4U1OTJCk5OTnk+bffflsjR47U5MmTVVJSovPnz1/xPdra2uT3+0MWAAB6ggrcga6uLq1atUp33XWXJk+eHHz+0Ucf1dixY5Wenq7Dhw/r6aefVk1NjT744IPLvk9paamee+45p8MAALiYm69Cd5zACwsLdeTIEe3bty/k+RUrVgS/njJlitLS0jR37lzV1tZe9vOyJSUlKi4uDj72+/3KyMhwOiwAAFzBUQIvKirSjh07tHfvXo0ePfqq62ZlZUmSjh07dtkEHhsbq9jYWCfDAAC4HBV4DwUCAT3xxBPatm2b9uzZo8zMzGvGHDp0SJKUlpbmaIAAAFwJCbyHCgsLVVZWpg8//FCJiYny+XySJI/Ho/j4eNXW1qqsrEzz58/XiBEjdPjwYa1evVqzZ8/W1KlT++QbAAC4Fwm8hzZt2iTp4s1afmjLli1aunSpYmJi9Omnn+qVV15RS0uLMjIyVFBQoGeeeSZsAwYAAA6m0K8mIyNDFRUVvRoQAAAmbK6ie4NmJtCECRP6Nc7UDz+mCAA/5OYpdJqZAABgISpwAIC13FyBk8ABANZycwJnCh0AAAtRgQMArOXmCpwEDgCwlpsTOFPoAABYiAocAGAtN1fgJHAAgLVI4AAAWMjNCZxz4AAAWIgKHABgLTdX4CRwAIC13JzAmUIHAMBCVOAAAGu5uQIngQMArOXmBM4UOgAAFqICBwBYy80VOAkcAGAtNydwptABALAQFTgAwFpU4AAAWKg7gfdmcWLjxo36u7/7O8XFxSkrK0t/+tOfwvydXRsJHABgrUgk8HfffVfFxcVat26d/vznP2vatGnKzc3VmTNn+uA7vDISOAAABn79619r+fLleuyxxzRp0iRt3rxZCQkJ+u1vf9uv4xhw58ADgYAkye/3R3gkAAAnuv9+d/8970vnzp3r1Xnsc+fOSbo058TGxio2NvaS9dvb21VdXa2SkpLgc1FRUcrJyVFlZaXjcTgx4BJ4987MyMiI8EgAAL1x7tw5eTyePnnvmJgYeb3esOSKYcOGXfI+69at0/r16y9Z99tvv1VnZ6dSU1NDnk9NTdVf//rXXo/FxIBL4Onp6aqvr1diYuIl/1X5/X5lZGSovr5eSUlJERph5LEfLmI/XMR+uIj9cNFA2A+BQEDnzp1Tenp6n20jLi5OdXV1am9v7/V7BQKBS/LN5arvgWbAJfCoqCiNHj36quskJSW5+he0G/vhIvbDReyHi9gPF0V6P/RV5f1DcXFxiouL6/Pt/NDIkSMVHR2thoaGkOcbGhrk9Xr7dSxcxAYAQA/FxMRo+vTp2rVrV/C5rq4u7dq1S9nZ2f06lgFXgQMAMJAVFxdryZIluuOOOzRz5ky98soramlp0WOPPdav47AqgcfGxmrdunVWnJvoS+yHi9gPF7EfLmI/XMR+6HsPP/ywvvnmG61du1Y+n0+33XabysvLL7mwra8NCvTHdf4AACCsOAcOAICFSOAAAFiIBA4AgIVI4AAAWMiaBD4QWrdF2vr16y/pojNhwoRID6vP7d27VwsWLFB6eroGDRqk7du3h7weCAS0du1apaWlKT4+Xjk5OTp69GhkBtuHrrUfli5desnxkZeXF5nB9pHS0lLNmDFDiYmJSklJ0cKFC1VTUxOyTmtrqwoLCzVixAgNGzZMBQUFl9x0w3Y92Q9z5sy55Hh4/PHHIzRi9AUrEvhAad02ENx66606ffp0cNm3b1+kh9TnWlpaNG3aNG3cuPGyr2/YsEGvvvqqNm/erAMHDmjo0KHKzc1Va2trP4+0b11rP0hSXl5eyPHxzjvv9OMI+15FRYUKCwtVVVWlnTt3qqOjQ/PmzVNLS0twndWrV+ujjz7S+++/r4qKCp06dUoPPfRQBEcdfj3ZD5K0fPnykONhw4YNERox+kTAAjNnzgwUFhYGH3d2dgbS09MDpaWlERxV/1u3bl1g2rRpkR5GREkKbNu2Lfi4q6sr4PV6A7/61a+CzzU2NgZiY2MD77zzTgRG2D9+vB8CgUBgyZIlgQceeCAi44mUM2fOBCQFKioqAoHAxZ/9kCFDAu+//35wna+++iogKVBZWRmpYfa5H++HQCAQ+Id/+IfAz3/+88gNCn1uwFfg3a3bcnJygs9FqnXbQHD06FGlp6dr3LhxWrx4sU6cOBHpIUVUXV2dfD5fyPHh8XiUlZXlyuNjz549SklJ0S233KKVK1fq7NmzkR5Sn2pqapIkJScnS5Kqq6vV0dERcjxMmDBBY8aMua6Phx/vh25vv/22Ro4cqcmTJ6ukpETnz5+PxPDQRwb8ndgGUuu2SMvKytLWrVt1yy236PTp03ruued0zz336MiRI0pMTIz08CLC5/NJ0mWPj+7X3CIvL08PPfSQMjMzVVtbq1/84hfKz89XZWWloqOjIz28sOvq6tKqVat01113afLkyZIuHg8xMTEaPnx4yLrX8/Fwuf0gSY8++qjGjh2r9PR0HT58WE8//bRqamr0wQcfRHC0CKcBn8Dxf/Lz84NfT506VVlZWRo7dqzee+89LVu2LIIjw0CwaNGi4NdTpkzR1KlTNX78eO3Zs0dz586N4Mj6RmFhoY4cOeKK60Cu5kr7YcWKFcGvp0yZorS0NM2dO1e1tbUaP358fw8TfWDAT6EPpNZtA83w4cN1880369ixY5EeSsR0HwMcH5caN26cRo4ceV0eH0VFRdqxY4c+++yzkPbDXq9X7e3tamxsDFn/ej0errQfLicrK0uSrsvjwa0GfAIfSK3bBprm5mbV1tYqLS0t0kOJmMzMTHm93pDjw+/368CBA64/Pk6ePKmzZ89eV8dHIBBQUVGRtm3bpt27dyszMzPk9enTp2vIkCEhx0NNTY1OnDhxXR0P19oPl3Po0CFJuq6OB7ezYgp9oLRui7Qnn3xSCxYs0NixY3Xq1CmtW7dO0dHReuSRRyI9tD7V3NwcUjXU1dXp0KFDSk5O1pgxY7Rq1Sq9+OKLuummm5SZmalnn31W6enpWrhwYeQG3Qeuth+Sk5P13HPPqaCgQF6vV7W1tVqzZo1uvPFG5ebmRnDU4VVYWKiysjJ9+OGHSkxMDJ7X9ng8io+Pl8fj0bJly1RcXKzk5GQlJSXpiSeeUHZ2tmbNmhXh0YfPtfZDbW2tysrKNH/+fI0YMUKHDx/W6tWrNXv2bE2dOjXCo0fYRPoy+J567bXXAmPGjAnExMQEZs6cGaiqqor0kPrdww8/HEhLSwvExMQEfvKTnwQefvjhwLFjxyI9rD732WefBSRdsixZsiQQCFz8KNmzzz4bSE1NDcTGxgbmzp0bqKmpieyg+8DV9sP58+cD8+bNC4waNSowZMiQwNixYwPLly8P+Hy+SA87rC73/UsKbNmyJbjO999/H/iXf/mXwA033BBISEgIPPjgg4HTp09HbtB94Fr74cSJE4HZs2cHkpOTA7GxsYEbb7wx8NRTTwWampoiO3CEFe1EAQCw0IA/Bw4AAC5FAgcAwEIkcAAALEQCBwDAQiRwAAAsRAIHAMBCJHAAACxEAgcAwEIkcAAALEQCBwDAQiRwAAAsRAIHAMBC/w816T7aIYR0bgAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 14
    },
    {
      "metadata": {
        "id": "SWuioJi937T_"
      },
      "cell_type": "markdown",
      "source": [
        "# 数据准备2，为训练做准备"
      ]
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:14:25.546963Z",
          "start_time": "2025-01-15T02:14:25.515199Z"
        },
        "id": "pHl5b5kl37T_"
      },
      "cell_type": "code",
      "source": [
        "from torchvision import datasets\n",
        "from torchvision.transforms import ToTensor\n",
        "from torchvision import transforms\n",
        "\n",
        "\n",
        "# 定义数据集的变换\n",
        "transform = transforms.Compose([\n",
        "    transforms.ToTensor(), # 转换为tensor，进行归一化\n",
        "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差\n",
        "])\n",
        "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
        "train_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=transform\n",
        ")\n",
        "\n",
        "test_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=transform#对加载的图片转换为张量\n",
        ")\n",
        "\n",
        "# torchvision 数据集里没有提供训练集和验证集的划分\n",
        "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
      ],
      "outputs": [],
      "execution_count": 15
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:14:27.340800Z",
          "start_time": "2025-01-15T02:14:27.337143Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "7bMlqHmd37T_",
        "outputId": "34d095f6-a20f-4cf2-841b-62855d442fbd"
      },
      "cell_type": "code",
      "source": [
        "img, label = train_ds[0]\n",
        "img.shape  #img这时是一个tensor，shape=(1, 28, 28)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torch.Size([1, 28, 28])"
            ]
          },
          "metadata": {},
          "execution_count": 16
        }
      ],
      "execution_count": 16
    },
    {
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "k20SgbGL37T_",
        "outputId": "4b709a29-764e-40bd-dfe2-b1a8a8aa0ad6"
      },
      "cell_type": "code",
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(tensor([0.2860]), tensor([0.3205]))\n"
          ]
        }
      ],
      "execution_count": 17,
      "source": [
        "#计算均值和方差\n",
        "def cal_mean_std(ds):\n",
        "    mean = 0.\n",
        "    std = 0.\n",
        "    for img, _ in ds:  # 遍历每张图片,img.shape=[1,28,28]\n",
        "        mean += img.mean(dim=(1, 2))  # 计算每张图片的均值，dim=(1, 2)表示计算每张图片的每一个像素的均值,行列共同求均值\n",
        "        std += img.std(dim=(1, 2))\n",
        "    mean /= len(ds)\n",
        "    std /= len(ds)\n",
        "    return mean, std\n",
        "\n",
        "\n",
        "print(cal_mean_std(train_ds))\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T01:38:53.204831Z",
          "start_time": "2025-01-15T01:38:52.991635Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 413
        },
        "id": "qv50LHri37T_",
        "outputId": "a4e6069f-79d3-4944-f94a-7449d9afe715"
      },
      "source": [
        "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
        "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
        "    plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
        "    for row in range(n_rows):\n",
        "        for col in range(n_cols):\n",
        "            index = n_cols * row + col  # 计算索引，从0开始\n",
        "            plt.subplot(n_rows, n_cols, index+1)#因为从1开始\n",
        "            img_arr, label = train_ds[index]\n",
        "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
        "            plt.imshow(img_arr, cmap=\"binary\",\n",
        "                       interpolation = 'nearest')#interpolation='nearest'是临近插值\n",
        "            plt.axis('off')#去除坐标系\n",
        "            plt.title(class_names[label]) # 显示类别名称\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "\n",
        "#已知的图片类别\n",
        "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
        "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
        "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
        "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
        "#只是打印了前15个样本\n",
        "show_imgs(3, 5, train_ds, class_names)\n"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 700x480 with 15 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9U0lEQVR4nO2dd3gWVdrG7wgkwdAhAUIJEEC6aKgKhqaRKiCCKAKigAoqu64suquAdVGKlWZBxbgUDVKWIggWmlKkiCAtoKL0FkCJkPn+8Mr5nvMkM7yEtEnu33V5+UzmvDPnnXPOvIenBjmO44AQQgghxIdcldMdIIQQQgjJKNzIEEIIIcS3cCNDCCGEEN/CjQwhhBBCfAs3MoQQQgjxLdzIEEIIIcS3cCNDCCGEEN/CjQwhhBBCfAs3MoQQQgjxLblqI9O/f38UKVLkku1atWqFVq1aZdp9W7VqhXr16mXa9UjmsG/fPgQFBWHs2LGXbDtq1CgEBQVlQ69IoHD8CMlZ8ssavOKNzMSJExEUFISmTZtmRn/yHS+88AI+/fTTnO5GhggKCgrovy+++CKnu2px7tw5jBo1Ktf1K7vh+OU93nvvPWvsQkNDERkZibi4OLz22mtISkrK6S4SAddg5lDwSi8QHx+PKlWq4Ntvv8Xu3btRvXr1zOhXvuGFF15Ajx490LVr15zuymUzffp06/iDDz7A0qVL0/y9du3aWd6Xf//73xgxYkRAbc+dO4fRo0cDQKZq9vwGxy/v8swzz6Bq1ar4888/cfDgQXzxxRcYNmwYxo8fj3nz5qFBgwY53UUCrsHM4oo2MomJiVi9ejUSEhIwePBgxMfHY+TIkZnVN5LL6dOnj3W8du1aLF26NM3fs4OCBQuiYEHv6ZySkoLk5ORs6lHuh+OXd2nfvj0aNWpkjp944gksX74cnTp1QpcuXbB9+3YULlw43c+ePXsWYWFh2dXVfA3XYOZwRaal+Ph4lCxZEh07dkSPHj0QHx+fpo200U2dOhXR0dEICQlB48aNsW7dukveY9OmTQgPD0erVq1w5swZ13bnz5/HyJEjUb16dYSEhKBSpUoYPnw4zp8/H/D32bBhA2644QYULlwYVatWxeTJk9O0OXz4MO677z6ULVsWoaGhuPbaa/H++++naXf27Fk89thjqFSpEkJCQnDNNddg7NixkMXGg4KCcPbsWbz//vtGhdi/f/+A++t31q9fj7i4OJQpU8Y88wEDBqTb9lJzJz37blBQEIYOHYr4+HjUrVsXISEhmDx5MsLDwwEAo0ePNs991KhRWfId8zIcP3/Rpk0bPPXUU9i/fz8+/PBDAP/vl7hnzx506NABRYsWxd133w3grx+tV155BXXr1kVoaCjKli2LwYMH48SJE9Z1A5kHM2bMQExMDIoWLYpixYqhfv36ePXVV7Pni+dhuAb/4oo0MvHx8ejevTuCg4PRu3dvTJo0CevWrUPjxo3TtP3oo4+QlJSEwYMHIygoCC+99BK6d++OvXv3olChQulef926dYiLi0OjRo0wd+5c139BpKSkoEuXLli5ciUGDRqE2rVrY+vWrZgwYQJ27twZkA/KiRMn0KFDB/Ts2RO9e/fGrFmz8OCDDyI4ONhMjN9//x2tWrXC7t27MXToUFStWhWzZ89G//79cfLkSTz66KMAAMdx0KVLF6xYsQL33XcfGjZsiCVLluDxxx/HgQMHMGHCBAB/qRXvv/9+NGnSBIMGDQIAREdHX7KveYHDhw/jlltuQXh4OEaMGIESJUpg3759SEhISNM2I3MnleXLl2PWrFkYOnQoypQpg2uvvRaTJk3Cgw8+iG7duqF79+4AQFX7ZcLx8yf33HMPnnzySXz22WcYOHAgAODChQuIi4tDixYtMHbsWFx99dUAgMGDB+O9997Dvffei0ceeQSJiYl444038N1332HVqlUoVKhQQPNg6dKl6N27N9q2bYsxY8YAALZv345Vq1aZdya5fLgGBU4GWb9+vQPAWbp0qeM4jpOSkuJUrFjRefTRR612iYmJDgCndOnSzvHjx83f586d6wBw5s+fb/7Wr18/JywszHEcx1m5cqVTrFgxp2PHjs4ff/xhXTM2NtaJjY01x9OnT3euuuoq5+uvv7baTZ482QHgrFq1yvO7xMbGOgCccePGmb+dP3/eadiwoRMREeEkJyc7juM4r7zyigPA+fDDD0275ORkp3nz5k6RIkWc06dPO47jOJ9++qkDwHnuuees+/To0cMJCgpydu/ebf4WFhbm9OvXz7N/fmHIkCFOoFNqzpw5DgBn3bp1rm0uZ+6MHDkyzb0BOFdddZWzbds26+9HjhxxADgjR44MqK/5BY6f/5k2bdolx6V48eLOdddd5zjOX+9cAM6IESOsNl9//bUDwImPj7f+vnjxYuvvgcyDRx991ClWrJhz4cKFjH6tfAPXYMbIsGkpPj4eZcuWRevWrQH8pYLq1asXZsyYgYsXL6Zp36tXL5QsWdIct2zZEgCwd+/eNG1XrFiBuLg4tG3bFgkJCQgJCfHsy+zZs1G7dm3UqlULR48eNf+1adPGXO9SFCxYEIMHDzbHwcHBGDx4MA4fPowNGzYAABYuXIhy5cqhd+/epl2hQoXwyCOP4MyZM/jyyy9NuwIFCuCRRx6x7vHYY4/BcRwsWrTokv3J65QoUQIAsGDBAvz555+ebS9n7mhiY2NRp06djHeUpAvHz78UKVIkTfTSgw8+aB3Pnj0bxYsXx80332y9U2NiYlCkSBHzTg1kHpQoUQJnz57F0qVLM//L5GO4Bv+fDG1kLl68iBkzZqB169ZITEzE7t27sXv3bjRt2hSHDh3C559/nuYzlStXto5TH6q2t/7xxx/o2LEjrrvuOsyaNQvBwcGX7M+uXbuwbds2hIeHW//VrFkTwF8quEsRGRmZxsEt9fP79u0DAOzfvx81atTAVVfZjy3Vo3z//v3m/5GRkShatKhnu/zAmTNncPDgQfPfkSNHAPy1OG6//XaMHj0aZcqUwW233YZp06al69MU6NxJj6pVq2bCt8i/cPzyHmfOnLHeTQULFkTFihWtNrt27cKpU6cQERGR5r165swZ804NZB489NBDqFmzJtq3b4+KFStiwIABWLx4cfZ82TwA1+ClydBGZvny5fjtt98wY8YM1KhRw/zXs2dPAEjX6bdAgQLpXssRzq8AEBISgo4dO+Kbb74JeLKnpKSgfv36WLp0abr/PfTQQ5f5DUlmMXbsWJQvX978l+o/FRQUhI8//hhr1qzB0KFDceDAAQwYMAAxMTFpnLoDnTvp4eZXRQKD45e3+OWXX3Dq1CkrTUZISEiaf5ylpKQgIiLC9Z36zDPPAAhsHkRERGDTpk2YN2+e8R1s3749+vXrl31f3MdwDV6aDDn7xsfHIyIiAm+++WaacwkJCZgzZw4mT56coQcQFBSE+Ph43HbbbbjjjjuwaNGiS8apR0dHY/PmzWjbtm2GMxP++uuvacIOd+7cCQCoUqUKACAqKgpbtmxBSkqKtfB37Nhhzqf+f9myZUhKSrL+5aPbpX7fvEzfvn3RokULc6znRLNmzdCsWTM8//zz+Oijj3D33XdjxowZuP/++7OsT3n9mWcmHL+8RWp+kri4OM920dHRWLZsGW688caA3uOXmgfBwcHo3LkzOnfujJSUFDz00EOYMmUKnnrqKeYeuwRcg5fmsjUyv//+OxISEtCpUyf06NEjzX9Dhw5FUlIS5s2bl+FOBQcHIyEhAY0bN0bnzp3x7bfferbv2bMnDhw4gLfeeivd/p49e/aS97xw4QKmTJlijpOTkzFlyhSEh4cjJiYGANChQwccPHgQM2fOtD73+uuvo0iRIoiNjTXtLl68iDfeeMO6x4QJExAUFIT27dubv4WFheHkyZOX7J9fqVatGtq1a2f+u/HGGwH8pdLU/xpo2LAhAFxWyHxGSI3KyMvPPbPg+OUdli9fjmeffRZVq1Y1IdZu9OzZExcvXsSzzz6b5tyFCxfMsw9kHhw7dsw6f9VVV5kIl6yeK3kBrsFLc9kamXnz5iEpKQldunRJ93yzZs0QHh6O+Ph49OrVK8MdK1y4MBYsWIA2bdqgffv2+PLLL13rId1zzz2YNWsWHnjgAaxYsQI33ngjLl68iB07dmDWrFlYsmSJlRwqPSIjIzFmzBjs27cPNWvWxMyZM7Fp0yZMnTrVhKcNGjQIU6ZMQf/+/bFhwwZUqVIFH3/8MVatWoVXXnnFaF86d+6M1q1b41//+hf27duHa6+9Fp999hnmzp2LYcOGWSHWMTExWLZsGcaPH4/IyEhUrVo1X5R7eP/99zFx4kR069YN0dHRSEpKwltvvYVixYqhQ4cOWXrvwoULo06dOpg5cyZq1qyJUqVKoV69eqy3dRlw/HI3ixYtwo4dO3DhwgUcOnQIy5cvx9KlSxEVFYV58+YhNDTU8/OxsbEYPHgwXnzxRWzatAm33HILChUqhF27dmH27Nl49dVX0aNHj4Dmwf3334/jx4+jTZs2qFixIvbv34/XX38dDRs2zJaMtXkVrkHB5YY5de7c2QkNDXXOnj3r2qZ///5OoUKFnKNHj5rwr5dffjlNO6jwLRl+ncrRo0edOnXqOOXKlXN27drlOE7a8GvH+SsMesyYMU7dunWdkJAQp2TJkk5MTIwzevRo59SpU57fKTY21qlbt66zfv16p3nz5k5oaKgTFRXlvPHGG2naHjp0yLn33nudMmXKOMHBwU79+vWdadOmpWmXlJTk/O1vf3MiIyOdQoUKOTVq1HBefvllJyUlxWq3Y8cO56abbnIKFy7sAPB1KPblhA5u3LjR6d27t1O5cmUnJCTEiYiIcDp16uSsX7/etLmcueMWOjhkyJB077969WonJibGCQ4OzlVhhDkJx8//pIZfp/4XHBzslCtXzrn55pudV1991aSISCW9d65k6tSpTkxMjFO4cGGnaNGiTv369Z3hw4c7v/76q+M4gc2Djz/+2LnllluciIgIJzg42KlcubIzePBg57fffsuah+BjuAYzRpDjBODtQwghhBCSC7ni6teEEEIIITkFNzKEEEII8S3cyBBCCCHEt3AjQwghhBDfwo0MIYQQQnwLNzKEEEII8S3cyBBCCCHEt2So1hLJn8iUQxmttbF9+3YjDx061MipBUdTue6664wsK6AXLGhP2W3bthl5zpw5Rq5WrZrVbvjw4UYuUaLEZfY6/6Irx7/33ntG7tu3r5HLlSt3xffatGmTkVPrkqVy++23Gzk10zZxJzEx0chffvmldW7u3LlGLlWqlJHvueceq931119vZDken3zyidVu2bJlRpa16vr06WO1GzRoUEB9JznHr7/+auTIyMgc7MnlQY0MIYQQQnwLM/sSi4xoXb777jvrWBbV1P96k+XkZan533//3Wp3/PjxgO4tqVmzppFldXLA/hel1B7oKsCPPfaYkevXr3/ZfcgLyHGZMWOGde6VV14xstSUhYeHW+3kOalBkdcG7OJ2P//8s5G7du1qtWvevLmR77jjDq/u5xsWLVpk5AkTJljnZIXk5ORk65yss3T69GkjS+0mABw6dMjIVapUMbLWipYvX97IxYsXN7IuXPjLL78YuV27dkZ+7bXXQGzatGlj5BMnTljnypQpY2RZKFmOkRdS6wIArVu3NrJ8D1euXNlqt2TJEiNLzVtugBoZQgghhPgWbmQIIYQQ4lu4kSGEEEKIb6GPDAkYaU+XESubN2+22skpVaRIEeuctN1LW7v0nQGACxcuGPnUqVNGvvrqq6128nOB+vT88ccfRta+OdKfoEWLFta5Dz/8MKDr5yVmz55tHcvxe/75542s7e7Sv0L6SuiIsaJFixpZ+k3cddddVjvpW6P9Z/ITe/bsMfKoUaOMHBERYbWT8zolJcU6J/3H5BqUPkoaubb0Wi1WrJiRpT+U9qUpXbq0kaW/jJ4T48aNc+1HfqFVq1ZGlmMO2OtJjrN+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EBwcjISEBPP3Dz/8EDExMShcuDBKlSqFO++8Ez///LP12VatWqFevXrYsGEDbrrpJlx99dV48sknL3lPv8I16E8CXZfTpk1DmzZtEBERgZCQENSpUweTJk1K85kqVaqgU6dOWLlyJZo0aYLQ0FBUq1YNH3zwQZq227ZtQ5s2bVC4cGFUrFgRzz33HFJSUtK0mzt3Ljp27IjIyEiEhIQgOjoazz77rDWe+RmOYeaRoxuZPXv2AABKly6d6dceNWoUhgwZgsjISIwbNw633347pkyZgltuuQV//vknAKBXr144e/Ys/ve//1mfPXfuHObPn48ePXqgQIECAIDp06ejY8eOKFKkCMaMGYOnnnoKP/zwA1q0aJHGOerChQuIi4tDREQExo4di9tvvz3Tv192ERUVhQ0bNuD777+/ZNuVK1fioYcewp133omXXnoJf/zxB26//XYcO3bMtDl06BCaNWuGZcuWYejQoXj11VdRvXp13HfffXjllVdMu9OnT+Ptt99Gq1atMGbMGIwaNQpHjhxBXFwcNm3a5NqHixcvon///vjggw8wZ84cdO/eHcBf//rp27cvatSogfHjx2PYsGH4/PPPcdNNN1k/rABw7NgxtG/fHg0bNsQrr7yC1q1bX9Yz8xNcg/4k0HU5adIkREVF4cknn8S4ceNQqVIlPPTQQ3jzzTfTtN29ezd69OiBm2++GePGjUPJkiXRv39/a6N48OBBtG7dGps2bcKIESMwbNgwfPDBB3j11VfTXO+9995DkSJF8Pe//x2vvvoqYmJi8PTTT2PEiBFX/gDyABzDTMTJBqZNm+YAcJYtW+YcOXLE+fnnn50ZM2Y4pUuXdgoXLuz88ssvTmxsrBMbG5vms/369XOioqKsvwFwRo4cmeb6iYmJjuM4zuHDh53g4GDnlltucS5evGjavfHGGw4A591333Ucx3FSUlKcChUqOLfffrt1/VmzZjkAnK+++spxHMdJSkpySpQo4QwcONBqd/DgQad48eLW3/v16+cAcEaMGHG5jylX8tlnnzkFChRwChQo4DRv3twZPny4s2TJEic5OdlqB8AJDg52du/ebf62efNmB4Dz+uuvm7/dd999Tvny5Z2jR49an7/zzjud4sWLO+fOnXMcx3EuXLjgnD9/3mpz4sQJp2zZss6AAQPM3xITEx0Azssvv+z8+eefTq9e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eDhatWqFM2fOuLY7f/48Ro4cierVqyMkJASVKlXC8OHDcf78+YC/z4YNG3DDDTeY+TB58uQ0bQ4fPoz77rsPZcuWRWhoKK699lq8//77adqdPXsWjz32GCpVqoSQkBBcc801GDt2LBzHMW2CgoJw9uxZvP/++2Yu9O/fP+D+5hR79uxB3bp107xYASAiIsLI06ZNQ5s2bRAREYGQkBDUqVMHkyZNSvOZKlWqoFOnTli5ciWaNGmC0NBQVKtWDR988EGattu2bUObNm1QuHBhVKxYEc899xxSUlLStJs7dy46duyIyMhIhISEIDo6Gs8++ywuXrx4ZV8+D8Dx8w+BjlXq782nn36KevXqISQkBHXr1sXixYvTfO7AgQMYMGAAypYta9q9++67Vpvk5GQ8/fTTiImJQfHixREWFoaWLVtixYoVl+yz4zgYNGgQgoODkZCQYP7+4YcfIiYmBoULF0apUqVw55134ueff7Y+m+qvuGHDBtx00024+uqr8eSTT17ynldCjmpkroTDhw/jlltuQXh4OEaMGIESJUpg37591kNP5aOPPkJSUhIGDx6MoKAgvPTSS+jevTv27t2LQoUKed5n+fLlmDVrFoYOHYoyZcrg2muvxaRJk/Dggw+iW7du6N69OwCgQYMGWfI9s5r4+Hh0794dwcHB6N27NyZNmoR169ahcePGadpm5DmuW7cOcXFxaNSoEebOnYvChQun2y4lJQVdunTBypUrMWjQINSuXRtbt27FhAkTsHPnzoB8UE6cOIEOHTqgZ8+e6N27N2bNmoUHH3wQwcHBZoP7+++/o1WrVti9ezeGDh2KqlWrYvbs2ejfvz9OnjyJRx99FMBfC7lLly5YsWIF7rvvPjRs2BBLlizB448/jgMHDmDChAkA/jKP3n///WjSpAkGDRoEAIiOjr5kX3OaqKgorFmzBt9//72nk/SkSZNQt25ddOnSBQULFsT8+fPx0EMPISUlBUOGDLHa7t69Gz169MB9992Hfv364d1330X//v0RExODunXrAgAOHjyI1q1b48KFCxgxYgTCwsIwderUdOfFe++9hyJFiuDvf/87ihQpguXLl+Ppp5/G6dOn8fLLL2fuA/EZHD//EOhYAcDKlSuRkJCAhx56CEWLFsVrr72G22+/HT/99BNKly4NADh06BCaNWtmNj7h4eFYtGgR7rvv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\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 18
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T01:46:38.064599Z",
          "start_time": "2025-01-15T01:46:38.061257Z"
        },
        "id": "ZsiicmoL37UA"
      },
      "source": [
        "# 从数据集到dataloader，转换数据集\n",
        "#batch_size=32每次从数据集中加载32张作为一批，shuffle为true表示每次打乱数据顺序，可以使训练结果更优秀\n",
        "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
        "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
      ],
      "outputs": [],
      "execution_count": 19
    },
    {
      "cell_type": "markdown",
      "source": [
        "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
        "\n",
        "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
        "\n",
        "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
        "\n",
        "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
        "\n",
        "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
        "\n",
        "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
        "\n",
        "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
        "\n"
      ],
      "metadata": {
        "collapsed": false,
        "id": "UtUi9tnU37UA"
      }
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:27:52.029581Z",
          "start_time": "2025-01-15T02:27:52.017310Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "9DkXXrIu37UA",
        "outputId": "b1a7770d-6747-4806-f6e6-34b2f03868ae"
      },
      "cell_type": "code",
      "source": [
        "for datas, labels in train_loader:\n",
        "    print(datas.shape)\n",
        "    print(labels.shape)\n",
        "    break\n",
        "#查看val_loader\n",
        "for datas, labels in val_loader:\n",
        "    print(datas.shape)\n",
        "    print(labels.shape)\n",
        "    break"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32])\n",
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32])\n"
          ]
        }
      ],
      "execution_count": 20
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EVsDdYtL37UA"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:41:42.214317Z",
          "start_time": "2025-01-15T02:41:42.209523Z"
        },
        "id": "Yc9z8-Fi37UA"
      },
      "source": [
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__() # 继承父类的初始化方法，子类有父类的属性\n",
        "        self.flatten = nn.Flatten()  # 展平层\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(784, 300),  # in_features=784, out_features=300, 784是输入特征数，300是输出特征数\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(300, 100),#隐藏层神经元数100\n",
        "            nn.ReLU(), # 激活函数\n",
        "            nn.Linear(100, 10),#输出层神经元数10\n",
        "        )\n",
        "\n",
        "    def forward(self, x): # 前向计算，前向传播\n",
        "        # x.shape [batch size, 1, 28, 28],1是通道数\n",
        "        x = self.flatten(x)\n",
        "        # print(f'x.shape--{x.shape}')\n",
        "        # 展平后 x.shape [batch size, 784]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 10]\n",
        "        return logits #没有经过softmax,称为logits\n",
        "\n",
        "model = NeuralNetwork()"
      ],
      "outputs": [],
      "execution_count": 21
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:33:30.010091Z",
          "start_time": "2025-01-15T02:33:30.007355Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3eNW9E6637UA",
        "outputId": "35a2bee2-6c35-4fb6-dd32-ec3b7f8fd4fc"
      },
      "source": [
        "# 看看网络结构\n",
        "model"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "NeuralNetwork(\n",
              "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
              "  (linear_relu_stack): Sequential(\n",
              "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
              "    (1): ReLU()\n",
              "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
              "    (3): ReLU()\n",
              "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
              "  )\n",
              ")"
            ]
          },
          "metadata": {},
          "execution_count": 22
        }
      ],
      "execution_count": 22
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:41:29.428586Z",
          "start_time": "2025-01-15T02:41:29.424878Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3LWCxA_q37UB",
        "outputId": "6df136fe-c407-4cce-85cb-8cca96e9ac28"
      },
      "cell_type": "code",
      "source": [
        "#为了查看模型运算的tensor尺寸\n",
        "x = torch.randn(32, 1, 28, 28)\n",
        "print(x.shape)\n",
        "logits = model(x)\n",
        "print(logits.shape)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32, 10])\n"
          ]
        }
      ],
      "execution_count": 23
    },
    {
      "cell_type": "code",
      "source": [
        "784*300+300+300*100+100+100*10+10"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:34:28.868806Z",
          "start_time": "2025-01-15T02:34:28.865311Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "XQd9MLYH37UB",
        "outputId": "2cb8c056-f4be-484a-9c7f-7342bf8975fd"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "266610"
            ]
          },
          "metadata": {},
          "execution_count": 24
        }
      ],
      "execution_count": 24
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:38:23.349319Z",
          "start_time": "2025-01-15T02:38:23.346015Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VwVC9ue-37UB",
        "outputId": "04cfc5b4-869b-468f-ce07-efe6e610d1f2"
      },
      "source": [
        "for name, param in model.named_parameters(): # 打印模型参数\n",
        "      print(name, param.shape)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "linear_relu_stack.0.weight torch.Size([300, 784])\n",
            "linear_relu_stack.0.bias torch.Size([300])\n",
            "linear_relu_stack.2.weight torch.Size([100, 300])\n",
            "linear_relu_stack.2.bias torch.Size([100])\n",
            "linear_relu_stack.4.weight torch.Size([10, 100])\n",
            "linear_relu_stack.4.bias torch.Size([10])\n"
          ]
        }
      ],
      "execution_count": 25
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:47:39.617675Z",
          "start_time": "2025-01-15T02:47:39.607784Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "NryDxF8a37UB",
        "outputId": "37ca52fe-7433-475a-e9f9-5d73176a56fd"
      },
      "source": [
        "# 看看模型参数\n",
        "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True\n"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Parameter containing:\n",
              " tensor([[-0.0197, -0.0289,  0.0119,  ..., -0.0166, -0.0239, -0.0212],\n",
              "         [-0.0151, -0.0167,  0.0258,  ..., -0.0178, -0.0189, -0.0139],\n",
              "         [ 0.0053,  0.0312,  0.0228,  ..., -0.0266, -0.0218, -0.0004],\n",
              "         ...,\n",
              "         [ 0.0280, -0.0302, -0.0293,  ...,  0.0026, -0.0094, -0.0307],\n",
              "         [ 0.0090, -0.0318,  0.0064,  ...,  0.0252, -0.0185,  0.0110],\n",
              "         [-0.0084, -0.0064, -0.0218,  ..., -0.0055, -0.0333, -0.0198]],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([-0.0339,  0.0220, -0.0184, -0.0284,  0.0213,  0.0003, -0.0061, -0.0199,\n",
              "         -0.0155, -0.0241,  0.0067,  0.0063, -0.0244,  0.0129, -0.0194,  0.0005,\n",
              "         -0.0308, -0.0300, -0.0154,  0.0005,  0.0277,  0.0110, -0.0092,  0.0094,\n",
              "         -0.0023, -0.0272,  0.0168,  0.0113, -0.0325,  0.0262, -0.0202, -0.0340,\n",
              "         -0.0100, -0.0064,  0.0091, -0.0103,  0.0287,  0.0147, -0.0072, -0.0271,\n",
              "          0.0159,  0.0310, -0.0280,  0.0128, -0.0072, -0.0059, -0.0027,  0.0150,\n",
              "          0.0101,  0.0123, -0.0241,  0.0267, -0.0130, -0.0346, -0.0118, -0.0010,\n",
              "          0.0206, -0.0119, -0.0272,  0.0296,  0.0315, -0.0186, -0.0316, -0.0185,\n",
              "         -0.0326,  0.0110, -0.0053, -0.0070,  0.0197,  0.0115, -0.0230,  0.0096,\n",
              "          0.0230,  0.0010,  0.0138, -0.0309,  0.0098,  0.0356,  0.0221, -0.0262,\n",
              "         -0.0228, -0.0159, -0.0218,  0.0018,  0.0335, -0.0188,  0.0243, -0.0012,\n",
              "         -0.0063, -0.0241, -0.0215, -0.0056,  0.0249,  0.0071, -0.0088,  0.0348,\n",
              "         -0.0017,  0.0100,  0.0198, -0.0081, -0.0193, -0.0015, -0.0085, -0.0282,\n",
              "         -0.0339, -0.0072, -0.0129, -0.0130, -0.0240, -0.0190,  0.0156, -0.0240,\n",
              "          0.0306, -0.0067,  0.0098,  0.0313, -0.0109, -0.0296, -0.0218,  0.0332,\n",
              "          0.0062, -0.0308, -0.0347, -0.0189,  0.0251, -0.0307,  0.0257,  0.0031,\n",
              "         -0.0155, -0.0139, -0.0244,  0.0241,  0.0116,  0.0035, -0.0067, -0.0264,\n",
              "         -0.0286,  0.0171,  0.0293, -0.0272,  0.0186, -0.0157, -0.0274,  0.0009,\n",
              "          0.0166,  0.0089, -0.0098,  0.0275, -0.0089, -0.0297,  0.0349,  0.0021,\n",
              "          0.0251,  0.0029,  0.0014,  0.0264,  0.0165,  0.0163, -0.0211, -0.0220,\n",
              "         -0.0169,  0.0036, -0.0309,  0.0161,  0.0245, -0.0063,  0.0282,  0.0294,\n",
              "          0.0003, -0.0092, -0.0064, -0.0200, -0.0334,  0.0270,  0.0029,  0.0206,\n",
              "         -0.0211,  0.0200, -0.0139,  0.0273,  0.0277, -0.0339, -0.0318, -0.0055,\n",
              "          0.0006, -0.0050, -0.0012,  0.0029,  0.0158,  0.0015, -0.0058, -0.0300,\n",
              "          0.0009,  0.0259,  0.0243,  0.0324, -0.0351,  0.0174,  0.0253, -0.0269,\n",
              "         -0.0105,  0.0185, -0.0320,  0.0065, -0.0178,  0.0307,  0.0353, -0.0096,\n",
              "          0.0347,  0.0195,  0.0066,  0.0272, -0.0091,  0.0270, -0.0276,  0.0351,\n",
              "         -0.0216, -0.0325,  0.0003, -0.0169,  0.0101,  0.0010,  0.0208,  0.0210,\n",
              "          0.0305,  0.0080,  0.0308,  0.0101,  0.0192,  0.0152,  0.0016, -0.0114,\n",
              "          0.0067,  0.0240, -0.0143, -0.0161,  0.0114,  0.0071,  0.0076,  0.0284,\n",
              "          0.0200, -0.0061, -0.0219,  0.0153,  0.0339,  0.0209, -0.0277, -0.0258,\n",
              "         -0.0029,  0.0187, -0.0092,  0.0067,  0.0277, -0.0293,  0.0217,  0.0293,\n",
              "          0.0008,  0.0231,  0.0203,  0.0052,  0.0134,  0.0222,  0.0296, -0.0287,\n",
              "          0.0071,  0.0318, -0.0146,  0.0135,  0.0026,  0.0213, -0.0175, -0.0068,\n",
              "          0.0060,  0.0022, -0.0223, -0.0124,  0.0064, -0.0308,  0.0080, -0.0240,\n",
              "          0.0088, -0.0182,  0.0087, -0.0108, -0.0300,  0.0140, -0.0280,  0.0164,\n",
              "          0.0227,  0.0212,  0.0249,  0.0070,  0.0034,  0.0058, -0.0288,  0.0166,\n",
              "          0.0072, -0.0128, -0.0312, -0.0131], requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([[-0.0123,  0.0129, -0.0039,  ..., -0.0425,  0.0183, -0.0440],\n",
              "         [-0.0152, -0.0158,  0.0096,  ...,  0.0364,  0.0014,  0.0141],\n",
              "         [-0.0447,  0.0284, -0.0565,  ...,  0.0228,  0.0422, -0.0443],\n",
              "         ...,\n",
              "         [ 0.0190, -0.0526,  0.0462,  ..., -0.0475,  0.0131,  0.0110],\n",
              "         [ 0.0379, -0.0432, -0.0477,  ..., -0.0550, -0.0554,  0.0044],\n",
              "         [ 0.0062,  0.0159, -0.0220,  ...,  0.0439, -0.0104,  0.0467]],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([-3.7779e-02, -3.5056e-02,  5.2384e-02, -4.8539e-02,  7.6782e-03,\n",
              "          4.5942e-02,  1.9607e-02,  5.6713e-02, -5.3544e-02,  3.8354e-03,\n",
              "          4.1945e-03,  5.2687e-02, -1.1587e-02, -4.2496e-02, -4.1385e-02,\n",
              "          1.4240e-02,  1.5031e-02, -3.6466e-02, -1.9953e-02, -3.0011e-02,\n",
              "          3.2465e-02,  1.8024e-02,  4.4901e-02,  1.6822e-02,  2.2720e-03,\n",
              "         -2.6056e-02, -5.2685e-02,  2.1416e-03,  3.9982e-02, -4.5351e-02,\n",
              "         -2.7847e-02, -2.0041e-02, -2.5216e-02,  1.7338e-03, -5.5001e-02,\n",
              "         -1.3941e-02, -2.8187e-03,  4.3156e-02,  5.4807e-02, -4.4405e-02,\n",
              "          1.1508e-02, -4.5774e-02,  2.1320e-02, -2.1190e-02, -4.9294e-02,\n",
              "          5.1372e-03,  2.7257e-02, -2.8867e-02, -1.2686e-02,  4.1037e-02,\n",
              "          2.3581e-02, -4.9019e-02,  4.4442e-02, -1.3632e-02,  9.9471e-03,\n",
              "          4.6853e-02,  3.2306e-03, -2.8563e-03, -2.4479e-03,  2.4246e-02,\n",
              "         -5.7634e-02, -5.5894e-02,  2.2957e-02, -8.9231e-03,  3.6319e-02,\n",
              "          3.5571e-02,  5.1272e-02, -3.5716e-02, -3.9652e-02,  1.7156e-02,\n",
              "          5.1260e-02,  3.7781e-03, -4.6739e-02,  3.5092e-02,  2.5534e-02,\n",
              "          3.0048e-02,  4.4633e-03,  7.7453e-03,  3.5353e-02,  5.0333e-03,\n",
              "         -1.9671e-02,  5.1465e-02, -4.9082e-02,  3.9044e-02,  3.8985e-02,\n",
              "         -2.7756e-02, -1.5449e-02, -4.0314e-02,  4.2342e-02,  2.0575e-02,\n",
              "         -5.0559e-02, -4.5912e-02,  4.6804e-02,  2.2952e-03,  7.5901e-05,\n",
              "          1.5315e-02, -5.3527e-02,  2.8296e-02,  5.3564e-03, -3.0409e-02],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([[-6.7371e-02, -2.5291e-02,  5.1623e-03, -5.9208e-03, -5.4897e-02,\n",
              "          -1.7352e-02, -5.9667e-02,  6.0590e-02, -6.9084e-02,  8.0189e-02,\n",
              "           1.3219e-02, -4.7535e-02,  5.0091e-02, -3.7259e-02, -8.0216e-03,\n",
              "          -7.8610e-02,  4.5714e-02, -5.6804e-02,  9.5463e-02, -5.6729e-02,\n",
              "           1.8354e-02, -4.2552e-02, -8.7503e-02,  6.0271e-02,  6.6453e-02,\n",
              "           6.3660e-02,  3.1001e-02, -6.9667e-02, -3.1485e-02,  8.8009e-02,\n",
              "           1.0532e-02,  1.5448e-02,  9.9947e-02, -2.6763e-02,  2.5694e-02,\n",
              "           3.5430e-03, -3.7796e-03,  7.6009e-02,  2.1593e-02, -1.9239e-02,\n",
              "          -4.6656e-02,  9.6295e-02,  2.1745e-02, -7.0172e-02,  7.3338e-02,\n",
              "          -2.7745e-02, -4.5547e-02, -5.2328e-02,  6.7900e-02,  5.3463e-02,\n",
              "           2.5172e-02, -9.8171e-02, -7.9354e-02,  1.8996e-02, -9.7125e-02,\n",
              "           6.8428e-02, -7.8674e-02,  1.1393e-02,  3.6247e-02, -1.5094e-02,\n",
              "          -9.1116e-02,  5.7523e-02, -1.8539e-02, -4.4926e-02,  9.4938e-02,\n",
              "          -4.0079e-03,  8.9912e-02,  9.9486e-02,  8.1682e-02,  8.5233e-02,\n",
              "           8.4922e-02, -6.0408e-02, -2.8535e-02,  4.6668e-02, -1.1055e-02,\n",
              "          -3.5558e-02,  4.2589e-02, -4.8727e-03, -7.5640e-02,  3.5109e-02,\n",
              "          -4.5190e-02,  8.5581e-02,  6.8525e-02,  8.5978e-02, -7.0015e-02,\n",
              "           8.9192e-02, -1.6335e-02, -1.7718e-02,  7.9197e-02, -8.7727e-02,\n",
              "           1.0049e-02, -4.6699e-03, -3.2333e-03,  6.3121e-02,  5.2689e-02,\n",
              "          -3.7270e-02, -7.9663e-02, -5.9527e-02,  9.0059e-02, -6.4219e-02],\n",
              "         [ 4.7197e-02, -4.6190e-02, -8.7245e-02,  4.7148e-02,  3.8527e-04,\n",
              "          -9.1462e-02, -9.0445e-02,  5.2342e-03,  8.8331e-02, -9.4436e-02,\n",
              "          -3.9513e-04,  4.6280e-02, -9.2058e-02,  8.3093e-02, -9.0386e-02,\n",
              "           1.2896e-02,  1.5185e-02, -4.8423e-02,  7.5906e-02,  4.8153e-02,\n",
              "           9.4002e-02,  5.2189e-03,  2.7872e-02, -9.7866e-03,  8.6150e-02,\n",
              "           8.2914e-02,  1.6323e-02,  9.0228e-02,  3.5048e-02,  2.4038e-02,\n",
              "           7.3518e-02,  2.2111e-02,  8.3751e-02,  5.4026e-03, -3.9150e-02,\n",
              "           7.4098e-02, -1.8885e-02,  6.3671e-02, -6.5919e-02, -5.1623e-02,\n",
              "           1.7874e-02, -6.1978e-02, -6.0577e-02, -6.9217e-03, -6.2072e-02,\n",
              "           6.6392e-02,  3.2358e-02, -5.4158e-02,  9.6288e-02,  1.1485e-02,\n",
              "          -9.6332e-02, -1.7520e-02, -8.9259e-03, -9.6590e-02,  3.3634e-02,\n",
              "          -3.1063e-02, -8.0805e-03,  6.4987e-02,  6.9050e-02,  7.7621e-02,\n",
              "           8.4945e-02, -2.3733e-02, -8.0176e-02,  7.3840e-02, -8.2568e-02,\n",
              "          -6.6871e-02, -1.4004e-02, -8.7524e-02, -5.3391e-02, -9.4888e-02,\n",
              "           1.5901e-02, -6.6130e-02,  5.5445e-02, -6.2015e-02, -8.0878e-03,\n",
              "          -2.6777e-02, -8.1291e-02,  8.1780e-02, -6.1027e-02,  6.6498e-02,\n",
              "           9.2373e-02, -6.3473e-02, -2.1165e-02,  5.4737e-02,  7.8624e-02,\n",
              "          -6.4947e-02, -6.2837e-02,  5.5077e-02, -8.2170e-02, -6.4355e-03,\n",
              "          -8.1074e-02,  2.9874e-02, -2.9991e-02, -1.3791e-02,  1.9969e-02,\n",
              "          -9.9929e-03,  3.8475e-02, -8.2971e-02, -7.5418e-02,  9.1674e-02],\n",
              "         [-7.6082e-02,  7.7983e-02, -8.5680e-02, -2.9409e-03, -9.5935e-02,\n",
              "           2.8845e-02, -5.2191e-02, -7.3646e-02,  8.4338e-02,  5.3666e-02,\n",
              "           6.3236e-02,  7.1681e-02, -3.3838e-02, -6.1124e-02, -6.3589e-02,\n",
              "          -3.4652e-02,  7.1265e-02,  3.6112e-02,  5.4284e-03,  9.5734e-02,\n",
              "           7.6324e-02,  7.3117e-02, -4.9841e-02, -8.2203e-02, -3.7586e-02,\n",
              "          -8.6757e-02,  2.6652e-02,  4.9422e-02, -5.6527e-02, -5.8521e-03,\n",
              "          -8.4522e-03,  3.9311e-02, -9.6677e-02, -3.0013e-02,  4.5351e-02,\n",
              "           8.1660e-02, -3.6681e-02, -2.4786e-02, -4.7590e-02,  4.2173e-02,\n",
              "           9.4489e-02,  2.7829e-02, -7.0150e-02, -7.5837e-02,  1.3230e-02,\n",
              "           1.5270e-02, -2.6634e-02, -5.7840e-02,  8.1118e-02,  6.7207e-02,\n",
              "           3.9353e-02,  1.1302e-02,  3.1251e-02,  1.4036e-02,  1.2815e-02,\n",
              "          -6.2522e-02,  1.3688e-02, -1.6526e-02, -7.2847e-02,  3.0391e-02,\n",
              "          -1.4077e-02,  5.2155e-02, -8.2973e-02, -1.2424e-02, -9.6631e-02,\n",
              "          -6.4285e-02, -9.4647e-02,  9.5503e-03,  7.9036e-02,  9.4401e-02,\n",
              "           5.7725e-02,  7.7592e-02, -9.9397e-02, -2.0792e-02, -6.1480e-02,\n",
              "          -7.7130e-02,  2.4875e-02,  2.9975e-02,  9.3477e-02,  1.7384e-02,\n",
              "           5.8668e-02, -2.8836e-03,  6.8624e-02, -9.4747e-02,  9.0170e-02,\n",
              "          -3.9024e-02, -1.5874e-02,  5.2162e-03, -2.2289e-02, -9.4108e-02,\n",
              "          -1.3561e-02,  5.1663e-02, -9.3950e-02, -3.3466e-02, -4.6483e-02,\n",
              "           5.3607e-02,  1.5568e-02, -8.5126e-02, -6.1104e-03, -4.4057e-02],\n",
              "         [ 7.8241e-02,  4.7285e-02, -3.7067e-02,  5.3707e-02,  7.6767e-02,\n",
              "           2.0788e-02, -2.2054e-02, -5.0626e-02,  8.9896e-02,  9.9045e-02,\n",
              "           4.5590e-02,  4.3742e-02,  6.6141e-02,  3.6949e-02,  8.9373e-02,\n",
              "           1.3954e-02,  4.3709e-02,  8.2440e-02,  6.2680e-02,  2.8424e-02,\n",
              "           3.7782e-02, -7.5943e-02,  3.9787e-02, -3.6595e-02,  8.2544e-02,\n",
              "           6.9653e-02,  2.6434e-02, -7.6941e-02, -7.3613e-02, -3.1542e-02,\n",
              "           8.2673e-02,  9.8764e-02, -9.0196e-02,  9.6701e-02, -5.3129e-02,\n",
              "           3.5692e-04,  8.9373e-02, -2.1884e-02,  8.8805e-02, -4.9073e-02,\n",
              "           8.3304e-02, -4.8016e-02, -9.4383e-02,  9.0295e-04, -1.5058e-02,\n",
              "           7.1101e-02,  4.1045e-02,  4.6530e-03, -5.7562e-02,  5.4895e-02,\n",
              "          -8.7704e-02, -2.0537e-02,  4.0089e-02,  5.1694e-02, -7.1275e-04,\n",
              "          -6.1373e-02, -4.1244e-02,  1.9510e-02, -5.8894e-02, -4.0913e-03,\n",
              "          -6.4871e-02, -8.8492e-03, -8.3206e-02, -3.5212e-02, -4.6177e-02,\n",
              "           5.4824e-02,  9.4511e-03, -9.5755e-02,  9.5253e-02, -3.8723e-03,\n",
              "          -9.8391e-02, -6.0914e-02,  5.2641e-02,  9.8408e-02,  1.9403e-02,\n",
              "          -2.4040e-02,  4.8072e-02, -9.6194e-02, -1.7901e-02, -8.1750e-02,\n",
              "           6.5877e-02, -2.6793e-03, -4.6765e-03, -6.9698e-04,  2.6600e-02,\n",
              "           7.3597e-03,  1.0309e-02,  2.8976e-02, -9.8177e-02, -2.2104e-02,\n",
              "          -3.1533e-02,  6.4480e-02, -3.9867e-03,  2.6121e-03,  1.3361e-02,\n",
              "          -2.0314e-02,  8.8120e-02,  2.3682e-02,  9.7801e-02,  6.5103e-02],\n",
              "         [ 2.5088e-02,  8.1498e-02, -1.8472e-02,  3.4818e-02,  8.0830e-02,\n",
              "           9.6847e-02, -7.3415e-03, -2.5893e-02,  4.2086e-02, -1.9824e-02,\n",
              "           1.8144e-02, -3.8343e-03,  3.9058e-02, -4.6010e-02,  3.6584e-03,\n",
              "           3.8543e-02, -7.5034e-02, -6.6401e-03,  6.4544e-02, -2.2695e-03,\n",
              "           7.4369e-02,  7.1113e-02, -5.4342e-02, -3.9405e-02, -9.3096e-03,\n",
              "          -6.7021e-02,  1.3501e-02, -4.1728e-02,  1.4594e-02,  3.6852e-02,\n",
              "           2.0499e-02, -1.1464e-02, -6.3836e-02,  1.6635e-02,  3.7814e-02,\n",
              "          -7.7254e-02,  1.2290e-02, -8.1707e-02,  9.4307e-03,  2.2960e-05,\n",
              "          -4.1378e-03, -6.6654e-02,  7.1588e-02,  6.9444e-02,  9.2768e-02,\n",
              "          -1.8643e-02,  3.1515e-02, -4.9089e-03, -4.2454e-02,  5.1924e-02,\n",
              "           3.2321e-02,  9.7890e-03,  5.0457e-02,  6.8401e-02,  2.2067e-02,\n",
              "          -7.1575e-02, -4.6431e-02,  7.6074e-02, -2.8068e-02,  6.6420e-02,\n",
              "           5.9153e-02,  8.0526e-02, -5.2429e-02,  1.3640e-03,  7.8940e-02,\n",
              "          -5.7921e-02,  5.8430e-03,  8.1302e-02, -8.2203e-02, -9.1870e-02,\n",
              "           4.2387e-02,  6.2130e-02,  8.3029e-02,  5.9809e-02, -3.5491e-02,\n",
              "           5.0387e-02,  3.9819e-02, -2.2814e-02, -8.7817e-02,  3.4766e-02,\n",
              "          -1.5233e-02,  9.4488e-02, -3.2920e-02, -9.3488e-02,  7.2764e-02,\n",
              "          -7.8711e-02,  9.7661e-02,  1.1299e-02,  8.4633e-02, -1.6983e-02,\n",
              "          -7.3337e-02, -8.8581e-02,  5.3073e-02, -5.4902e-02, -9.9405e-02,\n",
              "          -5.8997e-02, -6.6319e-03,  2.3894e-02,  6.0275e-02,  6.6153e-02],\n",
              "         [ 9.2829e-02, -6.8926e-02,  9.1339e-02,  9.0721e-02, -8.5620e-02,\n",
              "           8.1673e-03, -3.0858e-02,  1.2955e-02,  4.8899e-03, -6.8875e-02,\n",
              "          -3.3087e-03,  1.6607e-02, -3.5681e-03,  8.3079e-02,  9.1721e-03,\n",
              "           9.3462e-03,  9.6050e-02, -9.1700e-02,  3.2366e-02,  5.6243e-02,\n",
              "           8.4967e-02, -9.5789e-02, -1.2111e-02,  1.9633e-02, -4.7994e-02,\n",
              "           8.2392e-02,  3.9106e-03,  4.1535e-02,  4.9728e-02,  1.6792e-02,\n",
              "           4.6891e-02,  9.8984e-02,  6.0908e-02,  2.7047e-02,  5.5463e-02,\n",
              "          -7.6557e-02,  7.8109e-02,  4.7627e-02,  1.6508e-02, -2.3129e-02,\n",
              "           4.9299e-02,  5.1202e-02, -5.5740e-02, -3.1277e-02, -4.0176e-02,\n",
              "          -7.1828e-02,  2.5126e-02, -1.4064e-02,  6.5440e-02,  9.6275e-02,\n",
              "           2.3753e-02,  5.3210e-03,  1.8792e-02, -8.9124e-02,  8.1624e-02,\n",
              "           1.7187e-02, -1.9455e-02,  6.3949e-02, -1.9461e-02,  3.3728e-02,\n",
              "          -1.7716e-02, -3.8587e-02,  7.5937e-02, -3.9032e-02,  1.2426e-02,\n",
              "          -2.2002e-02,  9.1934e-02, -7.2099e-02,  6.2988e-02,  5.9221e-02,\n",
              "           7.8590e-02,  4.1421e-02,  7.3818e-02,  2.7390e-02, -8.2057e-03,\n",
              "          -1.5897e-02,  3.5946e-02, -4.7606e-02,  2.4604e-02,  4.1174e-02,\n",
              "          -5.4900e-02, -8.3672e-02,  6.6573e-02, -2.5969e-02, -9.8373e-02,\n",
              "           9.3722e-03,  1.9950e-02,  9.9378e-02, -6.4061e-02,  3.0163e-02,\n",
              "           8.0617e-02, -7.6851e-02,  2.1930e-02, -1.8214e-02,  8.3953e-02,\n",
              "          -6.6957e-02, -6.4501e-02, -3.8376e-02,  6.9271e-03, -9.6386e-02],\n",
              "         [ 6.5429e-02, -5.9730e-02, -6.5020e-02,  2.2133e-02, -8.5656e-03,\n",
              "           4.4594e-02, -7.6733e-02,  5.0068e-02, -6.0924e-02,  5.7923e-02,\n",
              "          -5.4970e-02,  1.1846e-02, -7.1290e-02,  5.1640e-02,  5.6599e-02,\n",
              "          -8.2645e-02, -1.9831e-02, -5.8232e-02, -4.0433e-02,  3.3827e-02,\n",
              "           4.3788e-02, -9.4337e-02, -1.0204e-02, -2.5896e-02, -6.4195e-02,\n",
              "           6.1518e-03, -8.1416e-02,  9.4177e-02,  5.7350e-02,  9.3350e-02,\n",
              "          -7.9852e-02, -1.0907e-02, -4.4085e-02, -9.5738e-02, -3.5539e-02,\n",
              "           4.0424e-02,  6.7472e-02,  7.5336e-02, -9.2630e-02, -1.9171e-02,\n",
              "           5.2097e-02, -8.3308e-02, -9.7499e-02,  7.4429e-02,  9.4836e-02,\n",
              "           1.3943e-02,  4.8334e-02,  4.1644e-02, -4.4337e-02,  2.2139e-02,\n",
              "          -4.6866e-02,  3.3590e-02,  4.7768e-02, -6.9640e-02, -7.4652e-02,\n",
              "           2.0548e-02,  5.0905e-02,  3.0281e-02,  7.7344e-02,  5.7199e-02,\n",
              "           4.9139e-02,  8.3514e-02,  4.8101e-02, -4.7521e-02, -3.6308e-02,\n",
              "           5.5952e-02, -3.2948e-02,  8.5000e-02, -9.0762e-04, -9.4076e-02,\n",
              "          -1.6032e-02, -4.8878e-02, -9.4470e-02,  8.0510e-02, -5.3487e-02,\n",
              "           7.7889e-02, -6.0828e-02, -3.2409e-02, -4.9179e-02,  4.0684e-02,\n",
              "           8.3418e-02,  3.9773e-03, -6.7485e-02, -4.7602e-02,  5.4171e-02,\n",
              "           4.5683e-02, -6.0575e-02, -5.9647e-02,  8.0121e-02, -3.8254e-02,\n",
              "           7.0052e-02, -6.5800e-02, -2.4866e-02, -5.7496e-02, -5.1073e-02,\n",
              "           6.3902e-02, -7.7191e-02, -5.7585e-02,  5.0383e-02, -9.3381e-03],\n",
              "         [ 4.0399e-02, -1.3030e-02,  9.1434e-02, -4.1450e-03, -3.0535e-02,\n",
              "          -5.7287e-02, -8.5084e-02, -3.8391e-02, -6.8471e-02, -8.6361e-02,\n",
              "           4.6303e-02, -9.5998e-02, -5.1623e-02, -4.8339e-02, -8.3565e-02,\n",
              "           7.5268e-02, -1.0538e-02,  9.3275e-02,  3.8964e-02, -2.8688e-02,\n",
              "          -7.0316e-02, -1.2154e-02, -5.6535e-02,  7.4289e-02,  6.4130e-02,\n",
              "          -7.0076e-02, -2.5382e-02,  8.4611e-02, -8.2190e-02, -4.7470e-02,\n",
              "          -7.7384e-03,  2.9305e-02, -2.9588e-03,  5.9957e-02,  8.5180e-02,\n",
              "           7.0910e-02,  3.0584e-02, -6.2246e-02,  2.6520e-02, -2.5721e-02,\n",
              "           9.5177e-02, -6.2161e-02,  4.6904e-03, -9.4084e-02,  6.5521e-02,\n",
              "          -8.0632e-02,  7.8085e-02, -2.0501e-02, -1.7831e-02, -1.4163e-02,\n",
              "           1.3188e-03,  7.8790e-02,  3.3486e-03,  2.0265e-03, -6.5111e-02,\n",
              "          -7.2751e-02,  9.9051e-02,  7.6039e-03, -7.4822e-02, -4.6731e-03,\n",
              "           6.2779e-04, -6.7813e-02,  5.2567e-03, -6.4745e-02,  6.3581e-02,\n",
              "           6.8580e-02,  9.8936e-02,  8.7047e-02,  2.3222e-02,  9.6825e-02,\n",
              "           8.6398e-02, -3.6813e-02, -1.1353e-02, -2.3059e-02,  3.1405e-02,\n",
              "          -8.7839e-02, -9.8103e-03, -8.8307e-02,  7.7422e-02, -5.5163e-02,\n",
              "          -1.2315e-02, -2.6552e-02,  2.6016e-02, -2.5439e-02,  2.8535e-02,\n",
              "           9.4532e-02,  9.6797e-02,  2.9535e-03, -8.7813e-02, -3.4724e-02,\n",
              "           8.9867e-02,  2.9321e-03, -2.6082e-02, -9.9675e-02, -4.9551e-02,\n",
              "           1.5996e-02, -9.8658e-02, -3.9846e-02,  5.1048e-02,  4.9934e-02],\n",
              "         [ 7.9664e-02,  6.6872e-02,  8.8526e-02, -7.8645e-02,  9.5283e-02,\n",
              "          -2.6833e-02, -7.4162e-02, -7.2229e-03, -6.7012e-02,  2.3545e-02,\n",
              "           3.3279e-02, -2.5174e-02,  2.4065e-02, -4.4542e-02, -8.9725e-02,\n",
              "           3.6896e-02,  9.3142e-02,  8.4430e-02, -8.9099e-02, -3.9797e-03,\n",
              "           3.9406e-02,  9.7468e-02,  8.8687e-02, -3.1374e-02,  7.3160e-02,\n",
              "          -2.9625e-02, -9.0487e-02,  3.3773e-02,  5.2281e-02,  4.4953e-02,\n",
              "          -5.6168e-02,  3.8343e-02, -7.0675e-02, -9.2671e-02,  2.4823e-03,\n",
              "          -9.1647e-02, -5.8820e-02,  4.4475e-02, -8.1352e-02, -4.1809e-02,\n",
              "          -9.0175e-02,  7.5794e-02,  8.4125e-02, -1.6118e-02,  3.3238e-02,\n",
              "          -4.5349e-02, -7.8205e-02, -6.6975e-02, -6.8468e-02,  6.9291e-02,\n",
              "           6.1744e-02, -8.0475e-02,  1.6180e-02, -9.5357e-02, -7.1978e-02,\n",
              "          -1.8994e-02,  3.8991e-02, -3.8153e-02, -7.0926e-02,  9.0110e-02,\n",
              "           1.3354e-02, -6.0242e-02, -8.6549e-02,  9.2704e-02, -7.8829e-03,\n",
              "           5.2394e-03, -5.1198e-03, -5.6069e-02,  1.7087e-02, -1.1495e-02,\n",
              "          -6.5562e-02, -6.5442e-02, -3.8801e-03, -9.3621e-02,  5.8954e-02,\n",
              "           7.8163e-02, -8.9065e-02, -8.6518e-02,  7.8209e-02,  6.9225e-02,\n",
              "          -8.0955e-02, -1.0855e-02,  5.5667e-02, -1.7311e-02, -6.8860e-02,\n",
              "          -1.7006e-02, -4.9877e-02,  1.7139e-03, -5.7203e-02, -4.4771e-03,\n",
              "          -7.8575e-02,  6.0198e-02, -1.0198e-02, -7.3197e-02,  6.6604e-03,\n",
              "           5.7057e-02, -4.0143e-02,  7.5242e-02, -2.1393e-02, -3.7002e-02],\n",
              "         [ 3.2360e-02, -3.5525e-02,  1.2248e-02,  8.1342e-02,  4.0947e-02,\n",
              "          -4.8843e-02, -2.5466e-02,  7.7961e-02,  2.2296e-02,  4.4257e-02,\n",
              "          -1.5331e-02, -7.7543e-02, -4.0480e-02, -6.4138e-02,  8.7314e-02,\n",
              "          -9.4609e-02,  7.3716e-02,  5.6571e-02,  8.4540e-02, -7.6477e-02,\n",
              "          -1.9321e-02, -2.1569e-03,  1.6468e-02,  9.2549e-02,  6.7234e-02,\n",
              "          -2.7918e-02, -2.2558e-02, -4.3691e-02, -5.0024e-02,  9.6695e-02,\n",
              "          -6.7580e-02,  1.3382e-02, -6.6376e-02,  4.5248e-02, -4.9871e-02,\n",
              "          -7.5600e-02,  5.5954e-03, -4.2601e-03, -4.1440e-02,  1.4346e-02,\n",
              "           2.3787e-02, -3.7817e-02, -3.1256e-02, -2.4237e-02,  2.0402e-02,\n",
              "           7.4259e-02,  9.4935e-02, -7.9494e-02, -2.8180e-02,  9.9274e-02,\n",
              "           4.8250e-02, -7.0338e-02,  5.5249e-02,  6.4491e-02, -3.7711e-02,\n",
              "          -1.9467e-03,  2.3916e-02,  5.1880e-02, -3.9577e-02, -3.5838e-02,\n",
              "           7.6763e-02, -3.9373e-02, -8.4476e-03, -4.5346e-02,  6.0259e-02,\n",
              "          -1.2996e-02,  4.3026e-03, -5.0942e-02, -7.2641e-02,  1.2564e-02,\n",
              "          -8.7114e-02, -6.4698e-02,  7.6732e-02, -3.3753e-02, -7.1113e-02,\n",
              "          -9.5528e-02, -9.9688e-02, -6.0532e-02, -3.0583e-02, -3.4841e-02,\n",
              "          -6.2422e-02,  9.1647e-02, -4.0064e-02,  6.8184e-02,  3.9221e-02,\n",
              "           2.8708e-02,  4.8525e-02,  7.2585e-02,  5.9329e-03, -5.3960e-03,\n",
              "           9.7091e-02, -8.3567e-02, -7.1830e-02,  9.3812e-02, -7.0305e-03,\n",
              "          -3.9355e-02,  5.2410e-03, -8.5473e-02, -9.1139e-02, -4.9933e-02]],\n",
              "        requires_grad=True),\n",
              " Parameter containing:\n",
              " tensor([-0.0872, -0.0509,  0.0547,  0.0156, -0.0919,  0.0414,  0.0990, -0.0543,\n",
              "         -0.0936, -0.0709], requires_grad=True)]"
            ]
          },
          "metadata": {},
          "execution_count": 26
        }
      ],
      "execution_count": 26
    },
    {
      "cell_type": "code",
      "execution_count": 27,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:34.677508500Z",
          "start_time": "2024-07-17T03:06:34.619793100Z"
        },
        "id": "yklwxEhD37UC"
      },
      "outputs": [],
      "source": [
        "# model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Qfukxa1G37UC"
      },
      "source": [
        "## 训练\n",
        "\n",
        "pytorch的训练需要自行实现，包括\n",
        "1. 定义损失函数\n",
        "2. 定义优化器\n",
        "3. 定义训练步\n",
        "4. 训练"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:51:52.227685Z",
          "start_time": "2025-01-15T02:51:52.224900Z"
        },
        "id": "ZWiT0nzF37UC"
      },
      "source": [
        "# 1. 定义损失函数 采用交叉熵损失\n",
        "loss_fct = nn.CrossEntropyLoss() #调用crossentropyloss的内置softmax，然后计算交叉熵\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package,随机梯度下降SDG\n",
        "\"\"\"\n",
        "lr=0.001：学习率（learning rate），控制参数更新的步长。\n",
        "momentum=0.9：动量（momentum），用于加速梯度下降并减少震荡。\n",
        "动量会考虑之前的梯度更新方向，从而在梯度方向上累积速度，帮助模型更快收敛。\n",
        "\n",
        "\"\"\"\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
      ],
      "outputs": [],
      "execution_count": 28
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T02:54:18.764007Z",
          "start_time": "2025-01-15T02:54:18.761382Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mR6Gj7hK37UC",
        "outputId": "de44f1e1-0154-473a-adf1-e88211f74703"
      },
      "cell_type": "code",
      "source": [
        "10000/32"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "312.5"
            ]
          },
          "metadata": {},
          "execution_count": 29
        }
      ],
      "execution_count": 29
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T03:12:38.201934Z",
          "start_time": "2025-01-15T03:12:37.782421Z"
        },
        "id": "WIrmcq7H37UC"
      },
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad() # 装饰器，禁止反向传播，节省内存（禁用梯度计算降低计算时间）\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = [] # 记录损失\n",
        "    pred_list = [] # 记录预测\n",
        "    label_list = [] # 记录标签\n",
        "    for datas, labels in dataloader:#10000/32=312\n",
        "        datas = datas.to(device) # 转到GPU\n",
        "        labels = labels.to(device) # 转到GPU\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失,loss尺寸是一个数值\n",
        "        loss_list.append(loss.item()) # 记录损失,item是把tensor转换为数值\n",
        "\n",
        "        preds = logits.argmax(axis=-1)    # 验证集预测,argmax返回最大值索引\n",
        "        # print(preds)\n",
        "        pred_list.extend(preds.cpu().numpy().tolist())#将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
        "        # print(preds.cpu().numpy().tolist())\n",
        "        label_list.extend(labels.cpu().numpy().tolist())\n",
        "\n",
        "    acc = accuracy_score(label_list, pred_list) # 计算准确率\n",
        "    return np.mean(loss_list), acc\n"
      ],
      "outputs": [],
      "execution_count": 30
    },
    {
      "cell_type": "code",
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "37500"
            ]
          },
          "metadata": {},
          "execution_count": 31
        }
      ],
      "source": [
        "1875*20"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:06:35.201490200Z",
          "start_time": "2024-07-17T03:06:35.194584600Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "VYpjv08M37UC",
        "outputId": "50c5604e-38e3-4559-d578-87ff7fbb89f9"
      }
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T03:24:57.495521Z",
          "start_time": "2025-01-15T03:22:42.704387Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 49,
          "referenced_widgets": [
            "3c401634e88f4fb5bf81a63bf1d001bf",
            "5e8e9f79e65c45579ed692acbeb18e73",
            "c753f913521f4b088f6aefbcdb793c13",
            "4f1b7dec806146d6b0c96f7b6cdb7119",
            "1748afc65cfb49b1b6fb437a507d7a0a",
            "2f8f93c135ca441ba5c25ebae604c518",
            "48c292b88a6a468fa3921dd765570057",
            "21c15ead02e24eafb7aec69c04745272",
            "95fae28812614cdd8f30f638e4d52137",
            "e0f31116d4d84f178a08072156ed52ca",
            "c8ce30a088ad4ad2a32ae27d27f3d10a"
          ]
        },
        "id": "tWDNA6KS37UD",
        "outputId": "d245e58d-8bcd-4545-a34c-5a023368d58d"
      },
      "source": [
        "# 训练\n",
        "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    #tqdm是一个进度条库\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
        "        for epoch_id in range(epoch): # 训练epoch次\n",
        "            # training\n",
        "            for datas, labels in train_loader: #执行次数是60000/32=1875\n",
        "                datas = datas.to(device) #datas尺寸是[batch_size,1,28,28]\n",
        "                labels = labels.to(device) #labels尺寸是[batch_size]\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas)\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
        "                optimizer.step() #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
        "\n",
        "                preds = logits.argmax(axis=-1) # 训练集预测\n",
        "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())   # 计算准确率，numpy可以\n",
        "                loss = loss.cpu().item() # 损失转到CPU，item()取值,一个数值\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
        "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval() # 进入评估模式\n",
        "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
        "                    })\n",
        "                    model.train() # 进入训练模式\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1 # 全局步数加1\n",
        "                pbar.update(1) # 更新进度条\n",
        "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息\n",
        "\n",
        "    return record_dict\n",
        "\n",
        "\n",
        "epoch = 20 #改为40\n",
        "model = model.to(device)\n",
        "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/37500 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "3c401634e88f4fb5bf81a63bf1d001bf"
            }
          },
          "metadata": {}
        }
      ],
      "execution_count": 32
    },
    {
      "cell_type": "markdown",
      "source": [
        "前向计算（Forward Pass）\n",
        "前向计算是指从输入数据到输出结果的整个过程。具体来说，输入数据通过神经网络的每一层，经过一系列计算（如线性变换、激活函数等），最终得到模型的预测结果。"
      ],
      "metadata": {
        "id": "abPIbpMU9dH4"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "反向传播（Backward Pass）\n",
        "反向传播是指通过计算损失函数的梯度，从输出层向输入层逐层更新模型参数的过程。它的核心是利用链式法则（Chain Rule）计算每一层参数的梯度。"
      ],
      "metadata": {
        "id": "YFwaL8MO9nix"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "record[\"train\"][-5:]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T03:25:40.988961Z",
          "start_time": "2025-01-15T03:25:40.985855Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "aQBZPz6R37UD",
        "outputId": "eeeab65d-46bd-45cb-fc4d-45a6d5602ca4"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[{'loss': 0.3115532696247101, 'acc': 0.90625, 'step': 37495},\n",
              " {'loss': 0.39871156215667725, 'acc': 0.8125, 'step': 37496},\n",
              " {'loss': 0.20052018761634827, 'acc': 0.90625, 'step': 37497},\n",
              " {'loss': 0.672593891620636, 'acc': 0.8125, 'step': 37498},\n",
              " {'loss': 0.24562495946884155, 'acc': 0.90625, 'step': 37499}]"
            ]
          },
          "metadata": {},
          "execution_count": 33
        }
      ],
      "execution_count": 33
    },
    {
      "cell_type": "code",
      "source": [
        "record[\"val\"][-5:]"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T03:25:47.520688Z",
          "start_time": "2025-01-15T03:25:47.517675Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "o0ENje5p37UD",
        "outputId": "6b3d19c7-8e04-479f-e54c-d7cdaca2cde0"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[{'loss': 0.367964594949263, 'acc': 0.8699, 'step': 33000},\n",
              " {'loss': 0.36926533330600864, 'acc': 0.8684, 'step': 34000},\n",
              " {'loss': 0.38603296992592157, 'acc': 0.8567, 'step': 35000},\n",
              " {'loss': 0.3524107951492357, 'acc': 0.8747, 'step': 36000},\n",
              " {'loss': 0.3710193249126212, 'acc': 0.8681, 'step': 37000}]"
            ]
          },
          "metadata": {},
          "execution_count": 34
        }
      ],
      "execution_count": 34
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-15T03:26:02.810428Z",
          "start_time": "2025-01-15T03:26:02.712170Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "C4lWpVas37UO",
        "outputId": "88208c86-1e7a-47e5-cc18-c10cde1731dc"
      },
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=1000):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "    last_step = train_df.index[-1] # 最后一步的步数\n",
        "    # print(train_df.columns)\n",
        "    print(train_df['acc'])\n",
        "    print(val_df['acc'])\n",
        "    # plot\n",
        "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
        "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        # print(train_df[item].values)\n",
        "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        axs[idx].grid() # 显示网格\n",
        "        axs[idx].legend() # 显示图例\n",
        "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
        "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
        "        axs[idx].set_xlabel(\"step\")\n",
        "\n",
        "    plt.show()\n",
        "\n",
        "plot_learning_curves(record)  #横坐标是 steps"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "step\n",
            "0        0.12500\n",
            "1000     0.68750\n",
            "2000     0.90625\n",
            "3000     0.71875\n",
            "4000     0.87500\n",
            "5000     0.78125\n",
            "6000     0.93750\n",
            "7000     0.90625\n",
            "8000     0.81250\n",
            "9000     0.90625\n",
            "10000    0.84375\n",
            "11000    0.90625\n",
            "12000    0.90625\n",
            "13000    0.96875\n",
            "14000    0.78125\n",
            "15000    0.87500\n",
            "16000    0.87500\n",
            "17000    0.84375\n",
            "18000    0.90625\n",
            "19000    0.71875\n",
            "20000    0.78125\n",
            "21000    0.81250\n",
            "22000    0.93750\n",
            "23000    0.84375\n",
            "24000    0.81250\n",
            "25000    0.93750\n",
            "26000    0.78125\n",
            "27000    0.87500\n",
            "28000    0.90625\n",
            "29000    0.90625\n",
            "30000    0.87500\n",
            "31000    0.87500\n",
            "32000    0.90625\n",
            "33000    1.00000\n",
            "34000    0.96875\n",
            "35000    0.96875\n",
            "36000    0.87500\n",
            "37000    0.87500\n",
            "Name: acc, dtype: float64\n",
            "step\n",
            "0        0.0967\n",
            "1000     0.6833\n",
            "2000     0.7537\n",
            "3000     0.7858\n",
            "4000     0.8046\n",
            "5000     0.8214\n",
            "6000     0.8203\n",
            "7000     0.8304\n",
            "8000     0.8312\n",
            "9000     0.8339\n",
            "10000    0.8332\n",
            "11000    0.8436\n",
            "12000    0.8373\n",
            "13000    0.8280\n",
            "14000    0.8428\n",
            "15000    0.8536\n",
            "16000    0.8522\n",
            "17000    0.8548\n",
            "18000    0.8492\n",
            "19000    0.8581\n",
            "20000    0.8498\n",
            "21000    0.8561\n",
            "22000    0.8601\n",
            "23000    0.8597\n",
            "24000    0.8613\n",
            "25000    0.8636\n",
            "26000    0.8645\n",
            "27000    0.8657\n",
            "28000    0.8675\n",
            "29000    0.8671\n",
            "30000    0.8680\n",
            "31000    0.8663\n",
            "32000    0.8694\n",
            "33000    0.8699\n",
            "34000    0.8684\n",
            "35000    0.8567\n",
            "36000    0.8747\n",
            "37000    0.8681\n",
            "Name: acc, dtype: float64\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAHACAYAAABqJx3iAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAADJkklEQVR4nOzdd3xb9dX48c/V9h5JPOPE2QMyySBhQwaEhtGWUqCsp9BfW0KBlI60lBL6FNpSVltauoBOoOVhtUlDTCCFQCCD7EmG48SO97a1dX9/XF3Zjpdky5ZknffrpZdjSVc6thX7Hp3zPV9FVVUVIYQQQgghhBhCDJEOQAghhBBCCCHCTRIdIYQQQgghxJAjiY4QQgghhBBiyJFERwghhBBCCDHkSKIjhBBCCCGEGHIk0RFCCCGEEEIMOZLoCCGEEEIIIYYcSXSEEEIIIYQQQ44p0gEEw+fzUVZWRkpKCoqiRDocIYSIG6qq0tTURF5eHgaDvDemk79LQggROcH+bYqJRKesrIyCgoJIhyGEEHHr5MmTjBw5MtJhRA35uySEEJHX29+mmEh0UlJSAO2LSU1NDfl4t9vN+vXrWbJkCWazOdzhhZXEOnBiKV6JdWDEUqwQHfE2NjZSUFAQ+D0sNPH0dwliK16JdeDEUrwS68CIlliD/dsUE4mO3haQmpra5z8oiYmJpKamxsQLSGIdGLEUr8Q6MGIpVoiueKU9q6N4+rsEsRWvxDpwYileiXVgRFusvf1tkoZrIYQQQgghxJAjiY4QQgghhBBiyJFERwghhBBCCDHkxMQaHSFEdFJVFY/Hg8lkwuFw4PV6Ix1Sj9xud8zECoMTr9FoxGQyyRocIYQQQ44kOkKIPnG5XJw+fZqWlhZycnI4efJk1J8sq6oaM7HC4MWbmJhIbm4uFotlwJ5DCCGEGGyS6AghQubz+Th+/DhGo5G8vDxcLhfJyclRv6Gkz+ejubk5JmKFgY9XVVVcLhdVVVUcP36cCRMmxMT3RQghhAiGJDpCiJC5XC58Ph8FBQXYbDYaGxux2WxRf5Ls8/lwuVwxESsMTrwJCQmYzWZOnDgReC4hhBBiKIj+v/RCiKgVC8mC6J38HIUQQgxF8tdNCCGEEEIIMeRIoiOEEEIIIYQYciTREUKIPiosLOSpp54Ky2Nt3LgRRVGor68Py+PFk/fee4/ly5eTl5eHoii8/vrrvR6zceNGZs+ejdVqZfz48bzwwgsDHqcQQojBJYmOECKufOYzn+G+++4Ly2Nt3bqVr3zlK2F5LNF3LS0tzJgxg2eeeSao+x8/fpwrr7ySSy65hJ07d3Lvvfdyxx138NZbbw1wpEIIIQaTTF0TQoh2VFXF6/ViMvX+63HEiBGDEJHozRVXXMEVV1wR9P2fffZZxowZw+OPPw7AlClT2LRpE08++SRLly4dqDCFEEIMsqGf6BzbiGnd95jtTgOWRToaIYYkVVVpdXkiMr0rwWwMejPN22+/nQ8++IAPPviAX/ziFwA8//zz3H777axdu5YHHniAPXv2sH79egoKCli5ciUfffQRLS0tTJkyhUcffZRFixYFHq+wsJB7772Xe++9FwBFUfj973/PmjVreOutt8jPz+fxxx/nqquu6tPX9n//9388+OCDHDt2jNzcXO6++26++c1vBm7/9a9/zZNPPsnJkydJS0vjggsu4JVXXgHglVdeYfXq1Rw5coTExERmzZrFG2+8QVJSUp9iGUo2b97c4ecIsHTp0sDPsStOpxOn0xn4vLGxEQC3243b7Q45Bv2YvhwbCbEUr8Q6cGIpXom1s2c2HuNETQsPXzUVm9nYp8eIlu9rsM8/9BMdtx2lch/JiWMjHYkQQ5bD7WPWT4si8tz7H15KoiW4X2VPPfUUBw4cYMaMGfzoRz8CYN++fQB897vf5ec//zljx44lIyODkydPsmzZMn784x9jtVr585//zPLlyzl06BCjRo3q9jlWr17Nz372Mx577DF++ctfctNNN3HixAkyMzND+rq2b9/OF7/4Rb773e9y880389FHH/H1r3+dYcOGcdttt7Ft2za+8Y1v8Je//IWFCxdSW1vL+++/D8Dp06e54YYb+NnPfsa1115LU1MT77//PqqqhhTDUFVeXk52dnaH67Kzs2lsbMRut5OQkNDpmEcffZTVq1d3un79+vUkJib2OZaiosj8v+mrWIpXYh04sRSvxKpp9cDTW42oKNSUl/K5Mb5+PV6kv6+tra1B3W/IJzoHazxMBpodLpIjHYwQIqLS0tKwWCwkJiaSk5MDwMGDBwF4+OGHWbx4ceC+mZmZzJgxI/D5j370I1577TXefPNNVqxY0e1z3Hbbbdxwww0APPLII/ziF79gy5YtXH755SHF+sQTT3DppZfyrW99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aaW0zi6Jjoga20/UoqowZngSI1KsA/Iccwu1AQdbi2tRVTXwply0iZNER/vlY5DWNSEGhikB33dPYTBEoBvWHNrJxXXXXce9997Lb37zG6xWK3/729/44he/iMFgoLm5mYceeog1a9Zw+vRpPB4Pdrs90D7WHwcOHGDGjBmBJAfgvPPOw+fzcejQIS688EJuu+02li5dyuLFi1m0aBGf//znA/dfuXIld9xxB3/5y19YtGgR1113XSAhEiLSjle38ObOMm5dOJr0REukwwm7k7WtbC2uQ1Hgqhn5gevz0xM4UdNKWYOcXwTr5a0l5Kcncv6E4QP2HKqq8scPimmoV1g2YM8SvQL75xSGd9paezNGpmE2KlQ0OjlZa2fUsOhM9ONijY5i8Vd0vM5e7imE6BNF0drHInEJ8V2kyy+/HFVVWbNmDSdPnuT999/npptuAuD+++/ntdde45FHHuH9999n586dTJs2DZfLNRDftU6ef/55Nm/ezMKFC3n55ZeZPHkyW7duBeChhx5i3759XHnllbzzzjtMnTqV1157bVDiEqI3TxYd5sm3D3PPSzujfgpTX7y5qwyABWOHkZNmC1yf51+nI5PXgnOwvJHv/N8evvbX7XgGcF3TzpP1/GTdYV48GhenuZ0M5CACnc1sZFp+GgBbonidTly8AhT/O75Gr7SuCRHvbDYb1157LX/729948cUXmTRpErNnzwbggw8+4LbbbuPaa69l2rRp5OTkUFxcHJbnnTJlCrt27aKlpSVw3QcffIDBYGDSpEmB62bNmsWqVav48MMPOfvss3nllVcCt02cOJH77ruP9evX89nPfpbnn38+LLEJ0V+fVmpDNf57uIoXPiyObDBhpqpqYNraNTPzO9ymDyQorZfzi2DsLdVacZucHvafbhyw59lXpj12vUuh2ekZsOeJRg63l92n6oGBGUTQ3lz/4289LolORBks2i8io09+EQkh4MYbb2TNmjU899xzgWoOaOteXn31VXbu3MmuXbu48cYbO01o66ubbroJm83Grbfeyt69e3n33Xe5++67ufnmm8nOzub48eOsWrWKzZs3c+LECdavX8+nn37KxIkTsdvtrFixgo0bN3LixAk++OADtm7dypQpERoAIUQ7qqpyoqYtgf/Jfw5yYABPYgfbvrJGjlQ2YzEZuHxaTofb2hIdqegE41B52+tiywCeHB8qbxt5fKImvjaL33myHrdXJSvFyqjMgW0nm+evGEXz5LW4SHSMVu0HbZZERwgBXHrppWRmZnLo0CFuvPHGwPVPPPEEGRkZLFy4kOXLl7N06dJAtae/EhMTeeutt6itrWXu3Ll8/vOf57LLLuNXv/pV4PaDBw/yuc99jokTJ/KVr3yFr3/969x+++0YjUZqamq45ZZbmDhxIl/4whe44oorWL16dVhiE6I/qpqctLq8GBS4aOIIXF4f33hxBw63N9KhhcXr/mrOoilZpJ6x8WK+7KUTkoPtEpCBPDk+2C6hKqmNr0RHr67MHZM54AMC5ozORFHgWHULVU3RuTwkLoYRGP0VHZMvOn8IQojBZTAYKCsr63R9YWEh77zzTofr7rrrrg6fh9LKpp6xx8+0adM6Pb4uOzu705obn89HY2MjFouFF198MejnFWIwHa/Wqjn5GQk8/oUZXP7U+3xa2cwjaw/w8NVnRzi6/vH61MD6nDPb1qDjGp1onjwVLQ6cbkt0thXXDcj3TFVVDrZ7nuI4q+jo62XmDeD6HF1aoplJ2SkcLG9iW3EtV0zLHfDnDFVcVHRMVm1qkUUSHSGEECKs9NagwmFJDE+28vgXtBHtf958gg0HKiIZWr9tPlpDZZOTtAQzF0/K6nR7rn8wgd3tpb7VPdjhxZTqZifVzU5tdo3JQE2Li6NVLb0fGKLSejtN7dblnIijio7H6+OTE/rEtYFPdNo/T7QOJIiLRMfsb12zqJLoCCHC429/+xvJycldXs4666xIhyfEoDnuX59TOEx7U/GiiSP4n/PGAPCtV3ZT2RS7beOv+/fOuXJ6LhZT51Mmm9nI8GRtnxJZp9Mzfd1M4bAkZhakAwPTvtZ+fQ7E1xqdA6ebaHF5SbGZmJSTMijPGRhIEKWJTly0rplsWqJjZXBGxAohhr6rrrqK+fPnd3mb2Wzu8nohhqJif+ta4fC2PaK+ffkkPjxazcHyJu7/525euG0uBkNstXU53F7W7S0Hum5b0+VnJFDd7KS03s7Z/nG7ojN9QMXknBTGjUhmy/Fath6v5YZ5o8L6PPo6oLHDkzhW3RJXrWt6VWXO6AyMg/T/TW+R21/WSJPDTYotuv7+xUVFx2rTfvlakYqOECI8UlJSGD9+fJeX0aNHRzo8IQaNfiI5ZnjbhCeb2cgvb5iF1WTgvcNVPB+DI6ffPlBBs9NDfnoCc0Z3v/FifrrWviZ76fRMT0Am56QGqgAD0e6kJ1RLp2qthtXNrrgZMd1+EMFgyUmzUZCZgE+FT0rqB+15gxUXiY4lQUt0zHjBKz20QoTLmYvtRWySn6Poq/ajpUcPS+pw24TsFB64UhuB/tP/HGR/WWyNnH59hzaE4OqZeT1Wo/QR0zJ5rWf6JLRJOSmcMzoDgwKn6uycbgjv901PqOYUZpBs0n636VXHoUxV1UD72GAMImhPX6cTjfvpxEWiY01o++Xrdg79F7sQA01vzWptjZ+WgKFM/zlKy50IVfvR0gUZnffs+NK5o1k0JQuX18c9L8XOyOm6FhcbD1UCcO2s7tvWoN3kNUl0uuXx+jhcoW0qOyU3hWSribPytDa/cO6n43B7A1MAJ2YnM1wrtlFcM/TP/Y5Vt1DT4sJiMjBt5OC2UM6L4oEEcbFGJ8HW9svXaW/BnJgeuWCEGAKMRiPp6elUVlbi8/nw+Xw4HA4Mhuh+78Tn8+FyuWIiVhj4eFVVpbW1lcrKStLT0zEajWF/DjFwVFXl1U9KmT4yjQnZg7Pw+EztR0t3tVhfURR++rnpXP60NnL6x2sO8KNr+j5yuqLRwXuHq/js7JF9XoPg9vr420cnqLd33+FxpLIZj09lam5qr9/bWKjonKhpYefJeq6akReREdjFNa24PD4SLcZAQjy3MJM9pQ1sLa7l6h7WQIXiSGUzXp9KeqKZ7BQrIxJUipuVARtIoKoq/9x2irJeqlI2s5Eb5o0iLWHg3kzSqykzC9Kxmgb3d7neKrfzZD1Oj3fQn78ncZHoWMxG7KqFBMWFw95McqQDEmIIyMnRdgivqqrCbreTkJAQ9XtIqKoaM7HC4MWbnp4e+HmK2LHtRB3f/OcuZhak8/pd50UkhuIzJq51ZViylcevm8Etz23hLx+d4K5LxpPjH8scqh++sY91+8ppdHj48vlj+vQYL20p4aF/7Q/qvr1VcyD6KzqqqvL//rKdg+VNjEi2snD88EGPoX3bmt4GOG9MBs99cJytx+vC+Dz6OqAUFEVhhE1rXTs+QK1rz31QzI/+Hdxr6eNjNTx329wB+V3u8vj428clAMwfxPU5urHDkxiebKG62cWeUw3MGeTWuZ7ERaKjKAoOLCTgwm2XVhshwkFRFHJzc8nIyGDDhg1ceOGFUd/65Ha7ee+992IiVhiceM1ms1RyYpS+7uBoVXPkYggMIug+0QG4cOIIzs5PZW9pIx8fr+nTO/g+n8qHR6sBePWTU31OdF7doY2MvmDCcEZldm6302UkWrh5Qe+DRUZmaIlOdbMLh9uLzRxd/5/2lTUGEoAjVc2RSXROtyUgOv1k+FBFE/WtLtITLf1+nkPl+mS3VABG+PPpEwPQura/rJGf/ucgAFecnUNmUtfxq8Ar20/x7qEq/vRhMbed17fXbU+eKDrMntIG0hPN3DR/8IfhKIrCnNGZrNtXzpbiWkl0IsGJ9gJ0OYZ+n6YQg8loNOLxeLDZbFGfPMRSrBB78YrBVdmkTRJtcnhodLhJjcBYVz3ZOnMQQVfmFmayt7Sxz61KhyqaaHRo07P2lTXyaUVTyC17xdUt7Cipx6DA41+YQVZK3ypL7aUlmEm0GGl1eSmrtzN2RHT1jbzuT+wgcpPhDp6RgAAMT7YydkQSx6pa2FZcx6Kp2WF4no4JVVtFJ7xvcjvcXu55aQcur49FU7L59U2ze6zUTMpO4Ydv7uOR/xzk3HHDOnwf+uvDo9X89r2jAPzks9P7XC3tr7ljtERn6/FauDgiIXQp+pvUw8SBtqGX2yEVHSGEELGvvKFtI85IrQ/parR0d+YFJjP1rVXpzA0J9c08Q/HGTm2S2nnjh4clyQHt3ey2dTrRtTmq16fy5q6ywOeRaq87MwHRBV4TYVrEfkCvHOVqiYQ+jKC62UmTI3xTd3+85gCfVjYzIsXKTz83rdd2tFsWjObSyVm4PD7ueXFn2IZy1LW4WPnyLlQVbphXwOVnR64FWf9ZbjtRh9cXPZM84ybRcSpaRcctFR0hhBBDQEVjZBOd9qOle1qjozuzVSlU+nSuKf6T2Nd3lOEL4YRKVdVAchTM2ptQtK3Tia43UzcfrQlU/iAyiU6jw80pfyXpzErG3DBO66pudlLd7ERRtIlrAAkmyEzSKp3hGkjw9v4K/vLRCQCe+MIMhiVbez1GURR+9vnpDE+2cqiiiUfXHuh3HKqqsurVPZQ3Ohg7IokffGZqvx+zP6bkppBkMdLk8HDIn9hGg7hJdFz+1jWPK7p+CQkhhBB9UdH+BDYCLUntR0uP7GK09JlGpFgZ61/Ls604tKpO+z1Cvn35JJKtJkrr7WwvCf5xdp9q4Hh1CzazgSVnhfed7/wMPdGJroqOnthNy9fGDUciIT7sP+nNTbORltixvXKef+H8nlMN2F39q3LoJ9eFw5JItLStzBjtX4cVjhHTlY0Ovv1/uwG44/wxXDBhRNDHDk+28vPrpgPwp80neOdgRb9ieXnrSdbtK8dsVPjFF2d1+JojwWQ0MNu/sW64KnThED+Jjr+i45WKjhBCiCGgsl1FJxIn2Pokq5EZiV2Olu7K3D62Kp2stVPR6MRsVFgwdligRee1HcG3r+n3XTI1h2RreE8K9da1SK2B6YrD7WXd3nIA7rpkHKCt63J5fIMax4Fu2tZAG+SQk2rD41PZcbJ/09cOnPZPdjtj3VbhMC3R6W9Fx+dT+eY/d1Hb4mJqbirfunxSyI9x8aQsbj+vEIBv/XM3lU19+397tKqZ1f7JgfcvmcTZ+YO7b053onE/nbhJdNx6ouOKnl9CQgghRF/4fGrEW5L0d8hHD+u9mqPT99sI9URIv/+0/DRsZiPX+IcZrNl9OqgTd4/Xx793a2tVrpmVF9JzByMa99J5+0AFzU4PIzMSWDI1B6vJgKp2XNs1GAKT0HI7L8BXFCXwmujvmOnAOqDcjomOPiijvyOmn/vgOO9/Wo3NbOAXN8zs814x37l8MpNzUqhpcfGtf+4Oqf0StFHS9760E7vby3njh3HnBWP7FMdAaPtZ1qKq0bFOJ+4SHZ+0rgkhhIhxNS2uDgt+I3GCHexo6fb0d3xDbVXSN0PUT6QWjBtGVoqVBrubjYcqez1+05FqqptdZCZZQmo3ClY07qXz+g4tsbt6Zh4GQ9vAhFODvI6oq9HS7c0rDE+7U1eT3QBGZ2pfd3E/Ep19ZQ38bN0hAB64cirjs/q+Qa/NbOQXN8zCajLw38NVvPBhcUjHP150KDBK+vHrZgb2JYoGMwvSMRsVKpuclNRGx/l2SInOo48+yty5c0lJSSErK4trrrmGQ4cO9XrcP//5TyZPnozNZmPatGmsXbu2zwH3lcef6Kju6PklJIQQQvRF+0EEEJmWKf3EMZhBBLqCzASyU60htyrpJ8F6omQ0KFw1Q6vM6JPUeqLf5zPTczEbw/8er75G53SDPeR36AdCXYsrkADq1a+8CEyGU1W13cS1rkcq68nrJyV1eLx9a6vzeH18WqHtJzUl98zWNe31WdzH1jW7y8s9L+3E5fWxeGo2N80f1afHaW9idgrfv3IKAD/5z8HA96g3Hx6p5nfvHQPgp5+L3Cjp7tjMRqaPTAfahodEWkj/2//73/9y11138dFHH1FUVITb7WbJkiW0tHSfJX/44YfccMMNfPnLX2bHjh1cc801XHPNNezdu7ffwYdCr+ggiY4QQogYp/f2Z6VoE58qmhy4+3iS2Ff6iWNhEKOldYqitK3TCbJVqarJybHqFhQF5oxu24jwGv/ktKIDFTT2MDq41eXhrX3lHY4Jt+wUK0aDgturUtXs7P2AAbZmz2k8PpWz8lIDew1FYh3RqTo7zU4PZqPC2BFdJ8QTs1JISzDT6vKyr6yxT89TXNOK0+Mj0WKk4IzBGKOH6Ru69m3E9I/X7udIZTNZKVZ++rnpvY6SDtbN547msslZuLw+7vvHbnorcNa1uLjvHzv9o6RHsTTMAzXCpa/r8AZKSKvx1q1b1+HzF154gaysLLZv386FF17Y5TFPP/00l19+Od/61rcA+NGPfkRRURG/+tWvePbZZ/sYdui8Bkl0hBBCDA3lDdrJ9Fl5qdQfqcHl9VHe4KAgM/ikQ3eipoUWp5epecFvYhjqaOn25o3J5N+7Twd9IrTNf79J2SkdpnadlZfK+KxkjlQ2s25vOV+YU9Dl8UX7K2h1eRk9LJFZBekhxRosk9FATqqN0no7pfV2slODe6e9utnJx5UKLdtPYTR2v+Zj+sj0wFjtYOibhLYfo50XgXVE+iS08Vkp3VbSDAaFOaMz2HCwkq3Ftczow89Ib1ubmJ3SqZUrxWZmWJKFmhYXJ2paQ1q4X7S/gr9+VAJoG8xmJllCjq07iqLw089P5/Kn3udIVQt/9xlw9/A6WLOnnIpGp3+U9JSwxRFu88Zk8Np/ayk9VMnLW9Khh8RwRIqVSyf3f6PYnvRr7EhDQwMAmZmZ3d5n8+bNrFy5ssN1S5cu5fXXX+/2GKfTidPZ9o5IY6P2Ana73bjdoWfjbrc70LqGu7VPjzFY9NiiOUZdLMUKsRWvxDowYilWiI54Y+V7FW/01rWctATy0m0U17RSWm8POdFRVZUbf/8x1c1O/vutS4JuhakMcbR0e/o7vnqrkqmXVjJ9EIF+nE5RFK6dlc9jbx3i9R2l3SY6+rS1q2fmh+3d+K7kpfsTnTo7s0dlBHXMd1/dx3+PGuHo/h7vZzMb+PfdFzA+K7nXxzxZ28q2E3UoCiyf0TZ4oW0E9uAlOm3rZnpe0zJ3TCYbDlay5Xgtd/Rhcb2+DujMtjVd4fAkalpcFNe0hJTo/O8a7edy5wWhjZIO1vBkK49/YQa3PreFHTUGdrze8+sgWkZJ92S+40PesX6TJLeTsjWZvOudxQbfLD70nYWDjnsOzR+TGb2Jjs/n49577+W8887j7LPP7vZ+5eXlZGd3/CKys7MpLy/v9phHH32U1atXd7p+/fr1JCaG/m4VAP6KTkt9dUTWCIWqqKgo0iEELZZihdiKV2IdGLEUK0Q23tbW6FhQKjrSW9eyU63kpSdoiU4fWpKqmp2BE9+PjtUE3dpV3IfR0rpJ2Smk2kw0OjzsK2vs9R18vfKjr+Vo76oZeTz21iE2H6uhvMHRKVGrbnby/qfVAFwzM/zT1trLT09gK3VBV0xcHh8f+dcxnD9+WLdTvI5Xt3CsuoV7XtrBq19f2Ou0rzf8e+ecN254h8pSXrr278Gs6PQ0Wro9PYnddqIOVVVDTkh7Wwc0elgi20/UhTSQoLTezomaVkwGhXsXTQwpnlBcNHEEq5dP4R+b9pGVlYVB6fr/k6JorZddJmqqCk3l0FgKHid4XeDzaB+9LvC62z4ajGBLh4T0jh+tKT1WX3rl88HGR0h67zFQwIeBPKWWm0wbuIkNuBQLB20z2Z0wn92J51JjymZiL6+LcOhzonPXXXexd+9eNm3aFM54AFi1alWHKlBjYyMFBQUsWbKE1NTgS7c6t9vNuk/fAiDVZuT8ZcvCFmu4ud1uioqKWLx4MWazufcDIiiWYoXYildiHRixFCtER7x6RV1El4pGreshJ9XWr9HGxdVtieyW4trgEx29bS2EiWs6g0FhTmEm7wTRqtTkcLPfv25jXmHnRKcgM5G5hRlsLa7jzV2lfOXCcR1u//euMrw+lRkj0xg7ovdqSH+EOnltT2kDTo+PJJPKc7fMxmLpui2qotHB5U+9x76yRh5ff5jvLeu+bUlV1XYVrI6J3cj0xEB8fUkm+uLg6e5HS7enjQ03UNvi4mhVc8hTzfTK0aRuTpzH9GEggT7p76z8NJKsJi2ZcDZCSzW01kJrtf/fNaB6wWAGoxkMpraL/rli0BIQd4u2hMJtB5f+71ZudjZzmfU0uSPOxpg0HBKHQWKmdknI1D5PyNCe8+i7UHsM6o5D7XH/v4vB3c83pRSjlvQkZMD4RXDBNyE5K7hjHQ3w6lfgsH+Jy4IVGC5eBSWbtesOv4Wl4STT7VuYbt8Ctb+ErLPAciWo3+tfgtWLPiU6K1as4N///jfvvfceI0eO7PG+OTk5VFR03P21oqKCnJzuF1FZrVasVmun681mc5//2Pv8FR2jzxkTJzj9+VoHWyzFCrEVr8Q6MGIpVohsvLH0fYoneutadqqtX6ON2+8WvzWEKUmBQQQh7KHT3lx/otNbq9InJfX4VG1aW3dtdVfPzGdrcR2v7yjrlOi8vrMscJ+BpreGBZtw6pWqsSk9Jx3ZqTZ+9vkZ3PnnbfzuvWNcOGEE508Y3uV995U1crSqBavJENhUVZeTZkNRwOnxUdPiYnhy5/OscHK4vYG9a6b08s69xWRgZkE6Hx2rZcvxupASnUaHm1P+amanypGqgruVCSku8qjGXd4EZT5/otGqJR7OZnA2aRdXU+Dfk06U8rKllsJmD/y8WUtofAPTymsARgJs+6jvD6IYICUPzAlgtIDR5P9o8SdcZu3fPjfY68FR3/bR69KStdYa7VJzBD75M5z7NVh4t5b8dKf6U3jxBqj5FIxWuOoXMOOL2m0TFmuXZT+HygNa0vPpejj5MVTu0xK5AU64Q0p0VFXl7rvv5rXXXmPjxo2MGTOm12MWLFjAhg0buPfeewPXFRUVsWDBgpCD7Q+f0Z/oeAd/92ghhBAinPSKTlaqtV9rL9q38nxa2Uxdi4uMIBZc92W0dHvzxmgnTr21KgX2z+mimqO7clouq/+1j/2nGzlc0cSYTC0hKq5pYefJeowGpcNalYGiJ5yngmwh1L+2cam9j6PWxxr/7eMSVv5jJ+vuvbDLhfH6EIJFU7NJsXV8k8JiMpCVYqWi0UlpnX3AE50jlc34VMhINDMipffnmleYyUfHatlaXMuNvY1wdtu1akpTOZVHD3Or8WPG2ZpIX/cmNJ2GpnJMTae52tkIO+Fy4HIbUAP8Lrj4p4CWgZz54zQnQdIwf9VluHaybjBrrWI+t79lzNPxc58PzDYtCTEntrskgCURr8HK/v37mFqYg9FRB/Zaf9WoVks87LVaMmK0QEYhZI6FjDHax0z/x7QCMPVhWIKqat9PRz3Y67Qq0aYnoHQ7vP84bP0DnHcPzP8qWM74/35oHbx6p1bpSs2H6/8K+bM7P4eiQPZU7XLBSu3rOvI22IJfL9VXISU6d911F3//+9954403SElJCayzSUtLIyFB+w9+yy23kJ+fz6OPPgrAPffcw0UXXcTjjz/OlVdeyUsvvcS2bdv43e+CfKWFi7+iY/ZJoiOEECJ2ub0+alq0RCc71UZ9q/Yuc18SnRNntPJsLa5lSRBja/V36kMZLd3etPx0rKbeW5W2nLF/TlcykixcNDGLtw9U8PqOUu67TKvq/GuXdo5y3vjhQZ1o99fIEFoIfT6VbSe08dpjg0h0QNuo8uPjtRypbObbr+zm97ec0yFB9PpU3tylVbCu7aaClZeeQEWjk7J6e5+mm4XigN62lpOK4rZD1QGo2AcV+7VKisHcob3r8w0uFGMFiZ9a4f3x4GjUTrzttVrlwV6nnSDb68DT9j0eD6w2A15gd9vzn5k6O1UzrVhJS03FYGmXbFhTwJrs/5gK1hRalUQeWl9Ci5rAT248j5TMHNBbyswJYf9e+dxujlWvZfLFyzB2VUVXVa3VzZygrbEJJ0UBS6J2Sc2D7LNg8pVwaC1s+JH2c9vwMHz0LFx4P0y/CVQVw6Yn4L+PAiqMWghf+FPwrW6JmTD9C+H9OroRUqLzm9/8BoCLL764w/XPP/88t912GwAlJSUYDG0LqRYuXMjf//53HnjgAb73ve8xYcIEXn/99R4HGAwEvaJj8kV+vr0QQgjRV1VNTlQVTAaFzERLhzU6oa690BOW3DQbpxscQSU62mhpvXWtbxUdvVXp4+Pdtyo5PV52nqwHuh5E0N61s/J5+0AFb+ws455LxqKq8Mau0/7bBr6aA20VnUaHhyaHu1NFpb3DlU002N0kWoyMTPIE9fgJFiNPf3Em1z7zIW8fqOBvH5fwpXNHB27ffLSGyiYn6YlmLpzY9YSw/PQEdpTUd0yK3XbY/ybs+QeYbDD9epi4FEx9SA5VVVsvUrGPEZ9s5BnzLubXlMMjJ4GeE7pRwH1mwANsCOK5DGZIyeWEJ429jQlk5xUyZ9pUrX0rJQd3wnA2fLCdy65YjjkhlYU/foeaFhf//uL5vU5e27SvnH94tzMhK5mUsy8K7msfSIqiJWOD+XyTr4SJl8Pe/4N3f6z9XP/zbUwf/IIFajrGJv9+mHPvgKWP9q2aNAhCbl3rzcaNGztdd91113HdddeF8lThZ9QrOpLoCCGEiF36+pysFCsGgxJYu+Jw+6htcTEsyJYkVVUDa3Q+N3skv3r3CFuKe9/Es7LJid3txWhQQh4t3d68MZl8fLz7VqU9pxpweXwMT7YwtpehB5dNySLZaqK03s72knpKmuFEbSsJZiNLpg7OxopJVhPpiWbqW92U1TuYlNN9oqO3rc0cmYrNe1xrSwpiPdxZeWl8e+kEnl27hdfX/IvL1OHkUgstlZQcSyCPHC6dPrvbSXj57ddzVR6A7X+CXS9qbUu6g//W1mSc/XmYeQPkze55HUVrLRx7F45s0C7NWiXtYgAjoJ92JQ7XqgXZZ2nv6Hdo7/KC181/dp+kvtnOwrHpjM7L0+JISPcvys/wX/z/9k8J++ZvPmRbTR1PL5jJnPaVLLcbp/kIWJLBYAxpxHRPk/7iisGoVV7OuhZ2/AX++zOUxlNkcQrVYEa58nE459ZIR9mj6B3EHW7+RMeiSqIjhBAidrWtz9ESHJvZyIgUK1VNTsrqHUEnOlXNbXvhfHZ2Pr969wj7ShtodXl63KdDX5+Tn54Q8mjp9vR1N1u6GYKgt63NGZ3Za5XKZjZyxdk5/HP7Kd7YdZrT1VpcS87K1iZmDZK8tATqW92U1rd2OwEMYOvxaq4yfMiDdWsZXnYM9nwdTAnamoX2l4R0rZ3KbYeGk9Bwii83lnGHzX8u81bbY94I3GgD55ECeP0iKDxfu6S37S80KlXhs4b3uGnvI7B9b9vBaQUw62atpWz3P7R1Llt/r12GT9ISnunXQ8IIUH0opZ9A8UZtnUXpNlB9bY9ltMCISfy7IpOdrpHcsPwKxp09P6i2pm2+/fxx03FuyhjFjy+f1uv9VVUNbEra3WhpXSgjpvWEv6eWybhiNMOc/4EZN+D96LdUbX2V4df+BNOYhZGOrFdxk+goRu2dEkl0hBBCxDJ9D52cDnukJFDV5KS0vpVpI4Nb4KuPls5LT2DsiGTy0myUNTjYUVLPeeO7nuoF/Rst3d7s0RkYFK26UFZvD7R+6QKDCIJ8V/3aWfn8c/sp1u0rx+vWEqNgx2WHS35GAvtPN1Ja3816YK8bdddL3H/4x4yynO640N1jh2Z7oCLSHQVQUagkg1O+YdiGjSYxfQT1R7cyzXAMa/NJ2PlX7QLa4vXC88Fk4ws7/8FNlkatyqIYYdIVcM5tMO7StrUfl/1Qq9DsfFGr7lQfgrcfgg0PY8yfw+Wn92Pa2dwxqBFTYPxl2lji0QupssOKH7+NosA3Z18OluDWlcwtzOSPm44HKiq9Ka230+T0YDYqjB3R8+tRHzF9vLq1x/u1ujzsK23Q4on3is6ZzAn4zr2Lj2vHsGzk3EhHE5S4SXQwau9wWVVXhAMRQggh+q5ttHRb5WZkegK7TtZ3f4LdBT1hGeNPWOaOyeSNnWVsOV7bY6Kjnyj2dbS0Ltlq4qy8NPaUNrC1uLbDCGhvu8X6wb6rPn/sMLJTrf6Kl0JmkpkLevg6BkKgNezMyWtuh9b688HTKA0nGQXUqckkXHAX7zSMYvHipZi9Ldp+JGde7PXaxK60AkgbCWkjUVJy2X2oljv/vA1Owxh3Esddy7nvwlzumVALxe9rl7Kd2tqKumIAzMApdTivGxax4r6HIDW38xdhMGoJy/hF2vPve11rbyvZjOHUFqyAak1BGXuJ/36XaXG1c7C8CtCSi4QgkxyAuYXaNL7DFcFNADx4WqvmjBuRjNnYc3VRT8xP1PRc0dlRUo/Hp5KfnhD4eYrYFTeJjsFf0bEhFR0hhBCx68zWNWjb9b7TCXYP9Bae0f6EZW6hluj09m66fqLY10EE7c0tzGRPaQNbjndMdA6VN9Hk8JBkMTIlN7g9VYwGhatn5vO7944B2thpU1cnv/qC+aTh2jqPMOq0eaurBbY9Dx/+MlCpcViH8XjzUvbmfo4/X3QR7rVrtRY1c9cDBLqzeGo2Xzp3FH/9qCQwVOLKORMgKwUmLNLu5GjU9iwpfh9aa2kZv5wL/uJCxcD/2EbQa6pqS9PWYJxzK9Qew/PpO2w+Usu5n1uB2db90XoC0lP7XleGJVsZNyKJo1UtbDtRx+Kp2T3eX98odEovG5JC2+u1uJdEZ0tgpHkPe8eImNH35toYo5i1d75Mig+3S5IdIYQQsan9ZqG6TifYQSg+I2GZ52/T2VFSj9vr6/Y4/aR6TD9b17Tn1E4mz0yu9M9nj87oOlnpxtUz2yasXTX9jCEEPp82XewPl8EvZsJPC+GFz8CmJ6F8r5YA9VNg89a6Vtj1Ejw1DdZ/X0tyUkfCsp/zv+Nf5vfezzB9bP/b6r6/bCrjs7RpXGfnp3aeXmdL1TZsXPwwXP0rks5aSrJVq5KE8loBIHMs6uxbqU2epK3Z6MHBINfNdEV/HeqjsoN7nt4TqtH+UejVzS6aHN1v/CmDCIaWuEl0jMa28qejtbmHewohhBDRq7JR30OnrXUtr/00rSAVV3ccET1+RDLpiWbsbi97/WsUztR+tPTofrauAczxt6UdrmimvrWttTyY/XO6MjU3lf93wRguyfUxQ1+r5HFqu7w/Mxf+cbO2EaJi0CZ+Fb+vrT959jx4fDK8fhfsfVXbq6UP8jMSyKaWldU/gNf+n7bZY8YYuOqX8I0dMO9OPizREsWeNkENVoLFyG9ums0lk0bw3cunBHVM22tl4PYV1Cstk4OsxrV33ZwCDAr8a1cZ/+ol2QkkOkFUdFJtZob5W+HO3D9K5/b62FFSD4Tn5yMiL24SHcVgwqdqixOdjt4nbgghhBDRqLyrik5GaBWd9qOl9bULBoPCnNHayV137WvhGi2tG55sDSwi3+afdKWqasiDCHSKonD/kglcU+hDcTXDB0/D0zPgzbuh5ojWinXB/fDNw3D3J7Ds5zBhqbZxZHO5toD/ldvhZ2Phj0thx1+1iWfBUFXGnnqNIuu3Oc+3HdVo0Rb2r9gGs28Bk4XqZifHqrTv+5wwtUZNyE7h+dvncf6E4NYj6a+VUNocQ+Hx+vi0QntDeUofKjqzR2Ww4pLxAHzvtT2cqus6KXG4vRyr0p4nmIoOtL3Wj3czeW1vaQN2t5f0RDPjRwzivjViwMTNGh3FoODAQiJOnK2S6AghhIg9DreXBrvWdpOd0rl1rabFhd3l7XUBePvR0gWZbQuu543J4O0DFWw5XsdXLux8XLH/nfD+jpZub15hJseqWthaXMuiqdmU1LZS2eTEbFSYWZAOXjc0lkLDKag/CS1V2ghjk1XbKd5k1Ta69H9UVIUpZf/E9MsV4NQqC6TkwYK7tLUm+rqc5BEwbBzMu1MbFlCyWRuXfGSDthv8yY+0y1vfh1lfgrlfhsyxXX8RDafgzW+QenQDKLDTN47sm/5I7oRZHe62zZ9ATspOIT3RgtvdfQvVQNHXc4Xcuhak49UtuLw+bTPUjL4t5v/GZRN4/0g1O0rqWfnyLl78yrkYDR1HjB+pbManQkaimayU4EaqFw5LYvuJum4HEmxtN9LcYOh5pLmIDXGT6AA4FS3RcUlFRwghRAzS29ZsZgOpCW1/wtMSzCRZjLS4vJQ12BnXy7vR7UdLW01tSZHerrPtRC0+n9rpZK+k1t/u1pf1OR6Xtj+L266NUnY7wGPn6oRTNBsOk3xgCwwfSevhgzxl3s8kWz22X96vHaN2v2boTCZgov7J8Ilw3j0w7Qs979xutsG4S7TL0h9rCdXeV2Drc9BQApt/pV3GL4K5d2rrXgxGbV3PJ3+Ctx4AVxMYrfzG8EV+3rSIvxlHceZMsy3HtarV3DGRW+ien65V4kJpcwyF3k42KSelz8mCyWjg6etnsewX77OluJZfv3uEuy+b0OXzTM5J7XWfJZ0+KbC7EdP6z2deBH8+IrziK9HBCjRJoiOEECImVTS1ta21P7lTFIX8jAQOVzRTWhdEolPT9UCBs/PTSDAbqW91c6SqmYnZKWccp50gjgllfU5zJWz5PWz9A9g7t8QtABZYgCZgLUwBphgBt/8CWgUnbaQ2Yjk5W1tf43GCx9Huo3ZR3XZqfCmkX/49TFOXg6EPlaf0Ajj/Plj4Dfi0SNs488jbbZf0Udr+M8ff1/acARg5D65+hk1v1OJtqumyYhJY6B7B9R+BCX0Dluj41+f0oW2tvVHDEnn46rNY+Y9dPLXhUxaOH845o9sSkIOnQ18HpCfoXU1e8/lUtp2I/M9HhFdcJTougxV84JFERwghRAwKTFxr17amy0vXEp1gWpLOHC2tMxsNzBqVzodHa9hyvLZTotM2iCCIik7VIa0Ksutl8PqnnRqtYEkEU4JWRTEloJpt7Chz0OgxMW1MDu+fNnCgNZ3lF83j7CnTtKQjKSvohMXjdvPB2rUsm7Ssb0lOewYjTLpcu9Qeg61/1Nbt1JfAhoe1+5hscOkP4NyvgcFIXtouoPMamGanh31l2pCHeRGc6DVygNfo6KOlgx0L3pNrZ+Wz8VAVb+4q496Xd7D2GxeQYtMmvoUycU2nD97oqnXtSFUz9a1uEsxGzs4PbtNdEf3iK9FRtD8MHmfPu+IKIYQQ0ahtD53OaxLyQ5i8duZo6fbmFmby4dEathbX8qVzR3e4TU90uh0trapw4gNt35jD69oFNwfO+wZM/oyWPLSjAC+8uIM3d5Vxc+Zo/nL4BIoCX79gCST0PMZ4UGWO1draLn0A9v4fbP8TWJPhisdg+PjA3fSpZmUNHX8On5yow6dqiUZuWuQ2otTjK2904PWpnda+9FegdS27/4mOoij877Vns/1EHSdr7fzwjX08cf1M//OEXjkqPGPEtJ40Qdv+ObNGpfe6+aiIHXGV6HgMFvCC1ykVHSGEELGnsouJa7pQRkzra3S6Slj0aoM++YzWWgybfsG0kl18vi6JBqOVaacOQ+swsCSBJUX72FgKm5+B0zv9j6TA5Cth4d1QMB96WEcxd0wmb+4q4+VtJwHtJDktmpKc9swJ2nCCWV/q8mZ9qtmpMyomW/s4MjvcslJsmAwKHp9KRaMj8LoJhwa7O/D662/rmi7VZubpL87kC7/dzKs7Srlo0ggWjhtOdbMLRaFT1bEnKTYzw5MtVDe7OFHT2qFyEw1thSL84izR0f4weF0DU64VQgghBlLbaOnOFZ1gW5Laj5buqgVt1qh0TAaFsgYHlfvfI2vd1zA2nmIsMNaAtjHFple6fwKTDWbepE05GzYuqK9LP/l3ebShA5Fs7eqv7jZv3dLHkdnhZjQo5KbbOFlrp6zeHtZE53CFVs3JS7ORlhi+RHVOYSYrLp3ALzZ8ygOv7eX7V2p7Bo0ZltTrhMEzjR6WRHWzi+PVLR0THf/PJ5Zfe6Kz+Ep0jHqiIxUdIYQQsaciiIrOmS1TZ+putLQu0WLirLxU5p7+O8P/+TKoHtSMMXykTmdftYtsm4flk1PB2QyuFm3amKsFUGDaddoY5qTg9nTRTchKJi3BHBidHcvvqrdvIVRVFUVRcHq87DxZD0TH15aXlsDJWjul9XbmhPFx2wYEhKea0943Lh3Ppk+r+KSkngff2Adok91CpY+YLm63l86pulbKGhyYDAqzRqWHK2QRBeIq0fH6Ex1VKjpCCCFikD5euqtERz/BPl3f89qL7kZLB7TW8pjnUSaaN4EKnHUtniue4I2/b+Ilj5EL80aw/PPzwvMF+RkMCnMLM3j7QCUQ2++q56RpPxuH20ddq5vMJAt7SxtwenwMS7IwbkQfRnOHWX5GAhwP/+S1A+1GS4ebyWjg6S/O4oqn36fZ6QH61h6nj5jWJwhCW9vaWflpJFri6tR4yIur1VY+o1bql0RHCCFELOqpopOVYsXoX3tR1eTs9jH0d7K7HChwahv89iIm1m/CqZp42vZV+PzzYE2hyqElTiGNlg6BXukYlZnY5dcXK2xmIyP8G1jqbYT6/ixzCjOC3vNlIAWqTmGcvOb2+gLteaFMQgtFQWYiP7rmrMDnoYyW1nU1Yjqwf06h7J8z1MRXomPyl+g9kugIIcRQ88wzz1BYWIjNZmP+/Pls2bKlx/s/9dRTTJo0iYSEBAoKCrjvvvtwOByDFG3omp0eWlxegC53gjcZDeSk6nukdD9dtMuJa6qqDRJ4bik0lOBNL+Szrod5sv5Calu1drIq/7emT5uFBuHaWfnMHpXO1y8Obl1PNDtzMES0LXTvbh1Rf/xiw6ccqWwmxWbivPGhtS6G4tpZI/nqReOYW5jRp+fRE/z2I6aj7ecjwie+6nP+1jXckugIIcRQ8vLLL7Ny5UqeffZZ5s+fz1NPPcXSpUs5dOgQWVlZne7/97//ne9+97s899xzLFy4kMOHD3PbbbehKApPPPFEBL6C3unVnBSriSRr13++89MTKK23U1rv4JzRXd6l3SACf2XGXgev3wWH1mifT70G41W/wPXrnVDZzNbiWi6dOIxqf0Wnq5HU4ZCVauPVr583II892EamJ7DrZD2l9XZtI8ri6FroHsqEvmBsOV7LM+8eAeCRa6cxPLlzIh5O371icp+P1V/3+ohpt1flSGUzIInOUBRXFR3VrP3HVjzR+46dEEKI0D3xxBPceeed3H777UydOpVnn32WxMREnnvuuS7v/+GHH3Leeedx4403UlhYyJIlS7jhhht6rQJFkp7odLWHji4/iMlrHUZLVx6E312sJTlGCyz7OVz3AtjSAtPBth6vRVVVqge4ojOU5KVrb6yW1ds5XNlEo8NDksXI1AFYpN8X7V8nqqr267Ea7G7ue3knPhU+N3sky2fkhSPEAaOPmAbt/4JezZmQlUxGkiWSoYkBEFeJjuJPdAzSuiaEEEOGy+Vi+/btLFq0KHCdwWBg0aJFbN68uctjFi5cyPbt2wOJzbFjx1i7di3Lli0blJj7oqf1Obr2J9hdaT9aekrLVvjjYqgrhvRR8OX1MO/OwH43+sjnrcW1VDY5cfkUjAYlMMZadK/9Ghh9bPHs0RmYomQjyjz/hqUtLi+Ndk+fH0dVVb7/2h5K6+2MHpbI6qvP6v2gKKCPVS+uaQn8fCI99lsMjPhqXbNo5UqDVyo6QggxVFRXV+P1esnOzu5wfXZ2NgcPHuzymBtvvJHq6mrOP/98VFXF4/Hw1a9+le9973td3t/pdOJ0ti3wb2zUxui63W7cbnfIMevHhHJsWZ1WiRmRbOn2uBz/2p2TtS1d3qeqSRstfatxPblr/gKqF1/BuXg//ydIHAbtjpk1UlvovbeskT2n6gFtfxR8Xtw+b9BxD7a+fG/DLTtFqwyU1rfy0THtutkFaZ1iilSsJgUyk8zUtrg5Ud3ElCAX9Z8Z72s7yvj37tMYDQo//9zZWA1qRL/v7fX0vR2VmcD2E3UcrWxiy/EaoOufz2CJhtdssKIl1mCfP64SHYNJe6fLKImOEELEtY0bN/LII4/w61//mvnz53PkyBHuuecefvSjH/GDH/yg0/0fffRRVq9e3en69evXk5jY9ylkRUVFQd93y3Ftt87mqlLWrj3Z5X1K6xTAyKFTVaxdu7bT7ccavDxkepHbTOtBhZLM89mVeTu+jR93+XgZFiN1Lvj9+p2AgWS1pcvHjUahfG/D7VQLgInjFQ2UVDUACt7yw6xde6jL+0ci1iSM1KLw5oZNHM8MrX2tqKiIagf8bJcRULg830PZng8p2zMwsfZHV99bV7X2/+TdHYfZW6sACk3HdrC2dMegx9deJF+zoYp0rK2t3Q9caS++Eh1/Rcfo7X7sphBCiNgyfPhwjEYjFRUVHa6vqKggJyeny2N+8IMfcPPNN3PHHXcAMG3aNFpaWvjKV77C97//fQyGji1Gq1atYuXKlYHPGxsbKSgoYMmSJaSmhr7uwu12U1RUxOLFizGbg9tBft1Lu6C8ggUzp7BsQdeTBiZWNvPswQ9p8ppZtmxpxxsdjVT96UvkmT4EwHvJg+QuuJvcHsYdb2jZw5u7T7O33gT4mDWhgGXLors9qS/f23Crb3Xz2O53afZo31uzUeH/fX4JNnPHfYsiGeuahp2c3F9J3vizWHbuqKCO0eO9+NLLuOVPO3H6GphbmMHjt8/pdt+mSOnpe6vuKWfNyd0caDThw0demo0vXXthhCKNjtdssKIlVr2q3pv4SnRsWqJj9klFRwghhgqLxcI555zDhg0buOaaawDw+Xxs2LCBFStWdHlMa2trp2TGaNROQrtanG21WrFaOw8BMJvN/fpjH8rxVc0uAPIykro9ZvQIrQWp2enB7oVUm/9+tcfhxS+SV32QVtXK62N+yI0X3UUX24V2MH/cMN7cfRqX1wfA2BHJUX8ipuvvz6Y/hqeaSLIYA+PAp+WnkZLY/dqqSMQ6MkNbp1Le5Ar5uX+76SS7TjWQajPx1BdnYbNG7yL+rr6347O1NydcHu11PW9MZlS8riP5mg1VpGMN9rmjY1XcIDFZtMV3Zp9UdIQQYihZuXIlv//97/nTn/7EgQMH+NrXvkZLSwu33347ALfccgurVq0K3H/58uX85je/4aWXXuL48eMUFRXxgx/8gOXLlwcSnmhT0aQPI+h+6lqixURGonYCEJi8dmIz/OEyqDpInWk417kepHXcFUE957wzxu2OHqDNQocaRVECI5whOhe6ByavhThi+mgjPPuetvDokc9OCwxeiCVnvo6j8ecjwiOuKjomq/buhVmVio4QQgwl119/PVVVVTz44IOUl5czc+ZM1q1bFxhQUFJS0qGC88ADD6AoCg888AClpaWMGDGC5cuX8+Mf/zhSX0KPVFWlolF7ky4rpfvKAGh7pNS1uimrtzOlYRP881bwuiB3Jne33se+ZjMrgxwRPT4rmYxEM3X+TUMLJdEJWn5GAp/692c5M2GMBvn+CX09jSI/U6PdzV8+NeJT4fPnjOQz06N7lHR39BHT1f4qaTT+fER4xFWiY/a3rllUV4QjEUIIEW4rVqzotlVt48aNHT43mUz88Ic/5Ic//OEgRNZ/DXZ3oM2mp310QBttvK+skbryYvj4q1qSM+Uq1Guf5ZP/fR/wBsbr9kZRFOYUZlK0vwIDaky+ex8pekVHUWDO6Og7kc5P186JuhtFfiZVVXnwzQPUuRRGZSbw0FXRvVarN4XDkqhudpGRaGZ8VnKkwxEDJK5a1yw27YVsVaV1TQghROwo9++hk5FoxmrqubUuLz0BBR/n7PgeOBog/xz4/HNUOYy0urwYFBiVGXxlRn+3O9MK5ijZByYW6EnhpOwU0hKjb92FvudSZZMTp6f3ceFv7Stnzd5yDIrKE9dNJ9ka2++V68n+nMJMlB4GcojYFle/sUw27ZeODUl0hBBCxA69ba2nzUJ1IzMSuNW4njGN28CUANf+Doxmimu0caz5GQlYTMH/+b9yei4FGQnMy/L1Lfg4tWRqNlkpVm7uZkJepGUmWbCZtddBeUPvLf1/+7gEgEtzVWaMTBvQ2AbDVTPzGJ5s4ab5wU2cE7EpttPxEFn9FR0bLtweL+Ze3hUTQgghokFFoz6IoPdEZ6KhlC+ZXtQ+Wfq/MHw8AMXVLYDWshOKvPQE3ll5QczsnxMtJmSnsOX7iyIdRrf0gQnHqloorbP32M5Y2ejggyPVACzIHhoJ70UTR7DtgcWRDkMMsLiq6FgTtP/ERkXF7ghtyogQQggRKZWNvU9cA8DjYs4n38GmuPlQmQVzvhy4qbimb4mOGLr09rreJq+9uasMnwqzCtIY3nuuLUTUiKtEx2Jr60l2trZEMBIhhBAieEG3rv33JyTW7KNOTeZexx24vG17AumJjoyIFrpgE503dpYBcPWM3AGPSYhwiqtERzFa8KragjOnvTnC0QghhBDB0VvXsnpKdEo+gk1PAvAD351Uqhkd1l4UV2trdMYEOVpaDH16otPT5LUjlc3sKW3AZFC44uycwQpNiLCIq0QHRcGhaGV/p0MqOkIIIWJDRZO/opPSTeuaswle+3+g+mDGDexLuxhoe6deVdW21jVJdIRfXhAVnTd2lgLampbMJMugxCVEuMRXogO40P6Tuh2tEY5ECCGECE5FQy/DCN76HtQVQ9oouOKnnVqSqpqcgdHSBRnSuiY0+Rl6RafrqWuqqvK6P9G5elb+oMUlRLjEXaLjVLQ/EpLoCCGEiAVen0pVcw9rdA6uhU/+DChw7W/AlhbYI0VvSerraGkxtLVPiFVV7XT7JyV1nKy1k2QxsnhK9mCHJ0S/xd1vO7dBq+h4pHVNCCFEDKhpceL1qRgUGJ58RutQcxW8ebf274V3Q+H5QNuu96V1/kSnj6OlxdCWk2ZDUcDl8VHd7Op0+2s7tGrO0rNzSLDIlhwi9sRfouOv6HhcUtERQggR/Sr9E9eGJ1sxGdv92VZV+Nc3oLUass6CSx8I3BSo6DToFR1JdERnZqOB7JSO1T+dy+Njze7TAFwrbWsiRsVdouMxags5paIjhBAiFnS7Wejx/8KhtWC0wGd/B6a2QQX62otARUcGEYhuBF4rZyQ67x2uoq7VzYgUKwvHDY9EaEL0W/wlOgbtD4XPLRuGCiGEiH5te+icMXFt/xvaxxk3QM7ZHW46c+3Fcf9o6ULZQ0ecIa+bEdP6EIKrZuRhNCiDHpcQ4RB3iY7X6E90pHVNCCFEDOhyDx2fDw6u0f495apOx+hrL5z+tRcnpKIjuqEnxafq2hKdJoebov0VAFwzU9rWROyKu0TH5090VJdUdIQQQkS/yiZ/61pKu0Tn1FZorgBrKoy5sNMxVpOREclaBWjXyXoZLS26lZ/eeY3OW/sqcHp8jBuRxNn5qZEKTYh+i79Ex6S9c4FHKjpCCCGiX3lgD512rWsH/6V9nLgUTF1v4qivvfjgaHXgcxktLc7U1Rqd1/3T1q6ZmY+iSNuaiF1x9xtPNfnfEXN3vTmWEEIIEU0Ca3TS/H+/VBUO/Fv79+TPdHucvvbiwyM1gExcE107c41ORaMjkBxfLW1rIsbFX6Jj9ld0ZBiBEEKIGNCpda1yP9QdB6MVxi/q9riR/hPYQxVNgCQ6omv6Gp26VjetLg//2lWGqsI5ozMYJcMrRIyLu0QHf+uawSOJjhBCiOjm9rZt5BhoXTvgb1sbdylYk7s9Vn+nXieDCERXUmxmUmwmQKvq6JuEXiN754ghIO4SHcWivTth8ErrmhBCiOhW1aS1rZmNChmJ/rU4etvalOU9Hpt/ZqIj786LbuivlY2HqthX1ojJoHDltNwIRyVE/8VdomPwt64ZJdERQggR5QKjpVNsGAwK1BVDxR5QjDDpih6PlYqOCJae6Pz+/WMAXDRxBJlJXQ+5ECKWxF+i46/oSKIjhBAi2umDCLICbWv+as7ohZCY2eOx+jQtQEZLix7prxX99SZta2KoiLtEx2jV/jObfJLoCCGEiG56RScwiEBfn9NL2xpAqs1EslVbeyGjpUVP2lf/kixGFk3JjmA0QoRP3P3WM1q1d7TMPmeEIxFCCCF6pic6OWk2aK6Ekx9rN0y+stdjFUUJtCTJxDXRk/bruS4/O5cEizGC0QgRPnGX6Jgk0RFCCBEjOrSuHVwDqJA3G9JGBnV8nn/Xe0l0RE/aV3SumZUXwUiECK84THS0X/YWVRIdIYQQ0a3DHjoH9Wlr3W8SeqaZBRkAzCnMCHtsYuiYkJ1MeqKZ8VnJLBw3PNLhCBE2pkgHMNgsNi3RsUqiI4QQIsrprWt5Njcc+6925eTe1+fo7r50PFfNzJPR0qJHqTYz73zzYowGBaNBiXQ4QoRN/CU6Cf6KDi5UVUVR5D+0EEKI6KS3ro2pfR98bhg+CUZMDPp4g0FhjIyVFkGQcdJiKIq71jU90UnAhdurRjgaIYQQomsOt5cGuxuAYaeKtCtDaFsTQoh4F3eJji0hWfuIC7vLE+FohBBCiK7pbWtpZg+mYxu0KydLoiOEEMGKu0TH7N9Hx6CoOB2tEY5GCCGE6JretrYs8SCKuwVSR0LerAhHJYQQsSPuEh3F0tar7LS3RDASIYQQont6RWeJYat2xZTPgKwrFUKIoMVdooPRjMf/ZTvtzREORgghhOhaRaMDI17muvRNQqVtTQghQhF/iQ7gxKp9lNY1IYQQUaqyyck8w0GSvY2QkAmjFkQ6JCGEiCnxmegoWqLjdkjrmhBCiOhU0ehgiWGb9smkZWCMux0hhBCiX+Iy0XH7Ex2PUyo6QggholNFg52lRn19TvCbhAohhNDEZaLjMvgTHanoCCGEiFIZ9fvIU2rxmpJg7MWRDkcIIWJOXCY6HoNUdIQQQkS3c+ybAGgdfQmYbRGORgghYk+cJjraHwyfSxIdIYQQ0elCVVuf45l4ZYQjEUKI2BSXiY7XKImOEEKI6OXx+sijGgDjyNkRjkYIIWJTnCc69ghHIoQQQnRmd3mw4QLAkpAS4WiEECI2hZzovPfeeyxfvpy8vDwUReH111/v8f4bN25EUZROl/Ly8r7G3G8+f6KDWxIdIYQQ0cfudGBSfABYE5IiHI0QQsSmkBOdlpYWZsyYwTPPPBPScYcOHeL06dOBS1ZWVqhPHTaqKUH7KImOEEKIKORsbZsKqpgTIxiJEELErpB3H7viiiu44oorQn6irKws0tPTQz5uIKgmraKjeCTREUIIEX2c9mYAPBgwGc0RjkYIIWLToG2zPHPmTJxOJ2effTYPPfQQ5513Xrf3dTqdOJ3OwOeNjY0AuN1u3G53yM+tH6N/1BMd3PY+Pd5AOjPWaBZLsUJsxSuxDoxYihWiI95Y+V4NNS6HNizHiRWTokQ4GiGEiE0Dnujk5uby7LPPMmfOHJxOJ3/4wx+4+OKL+fjjj5k9u+tJMo8++iirV6/udP369etJTOx7Cb+oqAiAhLomAJxNtaxdu7bPjzeQ9FhjQSzFCrEVr8Q6MGIpVohsvK2tMp0yElz+io5TsSIrdIQQom8GPNGZNGkSkyZNCny+cOFCjh49ypNPPslf/vKXLo9ZtWoVK1euDHze2NhIQUEBS5YsITU1NeQY3G43RUVFLF68GLPZzP5XPoFDkGwxcO6yZaF/UQPozFijWSzFCrEVr8Q6MGIpVoiOePWKuhhcHqe2RsetWCMciRBCxK5Ba11rb968eWzatKnb261WK1Zr51/uZrO5X3/s9eNNNu39MZPPEbUnO/39WgdTLMUKsRWvxDowYilWiGy8sfR9Gko8Di3RcRkk0RFCiL6KyD46O3fuJDc3NxJPDYDBorW/Gb3OXu4phBBCDD6PUxuW4zbYIhyJEELErpArOs3NzRw5ciTw+fHjx9m5cyeZmZmMGjWKVatWUVpayp///GcAnnrqKcaMGcNZZ52Fw+HgD3/4A++88w7r168P31cRIqNVS3TMPkfEYhBCCCG643VpFR2PJDpCCNFnISc627Zt45JLLgl8rq+lufXWW3nhhRc4ffo0JSUlgdtdLhff/OY3KS0tJTExkenTp/P22293eIzBZvInOiZVKjpCCCGij8+pDYEIbHAthBAiZCEnOhdffDGqqnZ7+wsvvNDh829/+9t8+9vfDjmwgWS2aYmOxSeJjhBCiOijurREx2uSREcIIfoqImt0Is1sTQbAIhUdIYQQUUh1a63VPmNChCMRQojYFZeJjiVBm7pmw9ljdUoIIYSICLe/dc0kiY4QQvRVnCc6LtxeSXSEEEJEF8WjTV3DLK1rQgjRV3GZ6FgTtNY1Gy7sbm+EoxFCCCE6akt0EiMbiBBCxLC4THTM/qlrCYoLh8sT4WiEEEKIjhSPtkZHMUvrmhBC9FVcJjq0+8PhsLdEMBAhhBCiM6NXS3T0Da6FEEKELj4TnXaLO52S6AghhIgyJq/WuqZYpKIjhBB9FZ+JjtGE27+FkNMhiY4QQojoYvJXdIzWpAhHIoQQsSs+Ex3AhQUAt1R0hBBCRBmTf583k1Va14QQoq/iNtFxKlYAPE5JdIQQQkQXi09LdMxS0RFCiD6L20THbdASHbejNcKRCCGEEB1ZVK11zWSTio4QQvRVHCc62iZsHpckOkIIIaKL1d+6ZrElRzgSIYSIXXGb6Hj8FR2vUxIdIYQQ0cPrU7HiAsCSIK1rQgjRV/Gb6Bi1io7PZY9wJEIIIUQbh9tLgj/RsSZIRUcIIfoqbhMdn7+i45PWNSGEEFHE7vZiQ29dkzU6QgjRV3Gb6Hj9m4aqbqnoCCHEUPDMM89QWFiIzWZj/vz5bNmypcf719fXc9ddd5Gbm4vVamXixImsXbt2kKLtnt3hxKJ4ATBYJNERQoi+MkU6gEhRTVrrGlLREUKImPfyyy+zcuVKnn32WebPn89TTz3F0qVLOXToEFlZWZ3u73K5WLx4MVlZWbzyyivk5+dz4sQJ0tPTBz/4Mzja7+9mlkRHCCH6Ko4THa2ig8cR2UCEEEL02xNPPMGdd97J7bffDsCzzz7LmjVreO655/jud7/b6f7PPfcctbW1fPjhh5jNZgAKCwsHM+RuuezNAPhQMJisEY5GCCFiV9wmOvgrOopHWteEECKWuVwutm/fzqpVqwLXGQwGFi1axObNm7s85s0332TBggXcddddvPHGG4wYMYIbb7yR73znOxiNxk73dzqdOJ3OwOeNjY0AuN1u3G53yDHrx3R1bGtzg/acWDB5PCE/9kDoKd5oI7EOnFiKV2IdGNESa7DPH7eJjupvBzBIoiOEEDGturoar9dLdnZ2h+uzs7M5ePBgl8ccO3aMd955h5tuuom1a9dy5MgRvv71r+N2u/nhD3/Y6f6PPvooq1ev7nT9+vXrSUzse3tZUVFRp+sqK0qZCziw8F4UrBlqr6t4o5XEOnBiKV6JdWBEOtbW1uCWnsRtoqNYtNY1g1da14QQIt74fD6ysrL43e9+h9Fo5JxzzqG0tJTHHnusy0Rn1apVrFy5MvB5Y2MjBQUFLFmyhNTU1JCf3+12U1RUxOLFiwOtc7rNmzZAGXgMNpYtWxb6FzcAeoo32kisAyeW4pVYB0a0xKpX1XsTt4mOwV/RMcoaHSGEiGnDhw/HaDRSUVHR4fqKigpycnK6PCY3Nxez2dyhTW3KlCmUl5fjcrmwWCwd7m+1WrFaO6+XMZvN/fpj39Xxqv/vkttgi7qTnv5+vYNJYh04sRSvxDowIh1rsM8dt+OljVZ/ouOTREcIIWKZxWLhnHPOYcOGDYHrfD4fGzZsYMGCBV0ec95553HkyBF8Pl/gusOHD5Obm9spyRlsHoc2dc1jkEEEQgjRH3Gb6Bj8rWtmn7OXewohhIh2K1eu5Pe//z1/+tOfOHDgAF/72tdoaWkJTGG75ZZbOgwr+NrXvkZtbS333HMPhw8fZs2aNTzyyCPcddddkfoSAnwube2ox2iLcCRCCBHb4rZ1zWRN0j5KRUcIIWLe9ddfT1VVFQ8++CDl5eXMnDmTdevWBQYUlJSUYDC0vbdXUFDAW2+9xX333cf06dPJz8/nnnvu4Tvf+U6kvoQAn39/N68xIcKRCCFEbIvbRMfsb12zSEVHCCGGhBUrVrBixYoub9u4cWOn6xYsWMBHH300wFGFTg0kOtK6JoQQ/RG3rWtmm1bRsaiS6AghhIgibi3RCWxsLYQQok/iONHRKjpW1YmqqhGORgghhPDzT12TREcIIfonfhOdBK2iY1XcuLy+Xu4thBBCDBK3NoxANUuiI4QQ/RG3iY7V37qWgBOHSxIdIYQQ0cHg0RIdRRIdIYTol7hNdPQ1OjZc2N3eCEcjhBBCaNoSncQIRyKEELEtbhMd/L3PNsWN3eWOcDBCCCGExuifBqpYJNERQoj+iN9Ep11LgNPeGsFAhBBCiDZGrzaMwGCVREcIIfpDEh3A6WiOYCBCCCFEG7M/0TFZZI2OEEL0R/wmOgYjLv9+qW57S4SDEUIIITRmnz/R8a8lFUII0Tfxm+gALkXbddrtkERHCCFEdDD7N7I2WSXREUKI/pBEB3A7ZY2OEEKI6GDREx2p6AghRL/EdaLjMWiJjkcqOkIIIaKAz6di9Sc6FpsMIxBCiP6I60THbbAB4HXZIxyJEEIIAU6PjwTFBYA1ITnC0QghRGyL60TH66/oeF1S0RFCCBF5drcXG5LoCCFEOMR1ouMxahUdVSo6QgghokCry0MCWuuaQTYMFUKIfonrRMdr1PYo8EmiI4QQIgo4XG5silv7xCz76AghRH/EdaKjmrSKDm6ZuiaEECLyHK3t/h5JoiOEEP0S14mOL5DoOCIbiBBCCAG42k8BNUmiI4QQ/RHXiU7gj4hHWteEEEJEnp7oOLGAIb7/RAshRH/F929Rf1uAIomOEEKIKOC2NwPgUiwRjkQIIWJfXCc6ij/RMXikdU0IIUTkuZ1aRUff500IIUTfxXei4x/dafRKoiOEECLyPE6tw8Dt3+dNCCFE38V1omOwaBUdkyQ6QgghooBXKjpCCBE2cZ3oGPWKjs8Z4UiEEEIIUF3aeGmvJDpCCNFv8Z3oWLVEx+yTio4QQojI8+mJjkkSHSGE6K+4TnRM1iQAzFLREUIIEQV8bm2Njs8oe+gIIUR/xXWiY/ZXdCyqJDpCCCGigMuf6MhmoUII0W9xneiYEtoSHVVVIxyNEEKIeKd4tNY1pHVNCCH6La4THatNa12z4cLp8UU4GiGEEPFO8beuqWap6AghRH/FdaJjtiUDYFNcON2S6AghhIgsxb+BtWJOjHAkQggR++I70fGv0UnAid3tjXA0Qggh4p3Bv6+bvqG1EEKIvovrRAd/a4ANlyQ6QgghIs7k1VrX9A2thRBC9J0kOoBV8WB3uCIcjBBCiHhn9Fd0DFLREUKIfpNEx8/paIlgIEIIIQSY/Pu6Gf37vAkhhOi7+E502u1T4JJERwghRIRZfFpFx2SVio4QQvRXfCc6BgMuzAC47ZLoCCGEiCyzfwNrsyQ6QgjRb/Gd6AAuxQqA29ka4UiEEELEM1VVseqJToK0rgkhRH/FfaLjNmiJjscpFR0hhBCR4/T4sKENxrEkJEc4GiGEiH2S6BhsAHiloiOEECKC7C4vNsWf6NikoiOEEP0V94mOx1/R8bok0RFCCBE5dreXBLTWNRlGIIQQ/SeJjlGv6NgjHIkQQoh4piU6/j3dzLJhqBBC9FfcJzo+f6KjuqWiI4QQInLsTk9gjQ5mqegIIUR/hZzovPfeeyxfvpy8vDwUReH111/v9ZiNGzcye/ZsrFYr48eP54UXXuhDqAPDZ9TeNVPdUtERQggROU6HHYOiap9IRUcIIfot5ESnpaWFGTNm8MwzzwR1/+PHj3PllVdyySWXsHPnTu69917uuOMO3nrrrZCDHQg+k1bRwSWJjhBCiMhxOZrbPjFJoiOEEP1lCvWAK664giuuuCLo+z/77LOMGTOGxx9/HIApU6awadMmnnzySZYuXRrq04edqv8x8UiiI4QQInKc/o2r3ZgwG0P+8yyEEOIMA75GZ/PmzSxatKjDdUuXLmXz5s0D/dTBMWsVHUUSHSGEEBGk7+emb2QthBCifwb8LaPy8nKys7M7XJednU1jYyN2u52EhM7leafTidPpDHze2NgIgNvtxu12hxyDfkyXx5r0RMfRp8cOtx5jjTKxFCvEVrwS68CIpVghOuKNle/VUOBxaENx9P3dhBBC9E9U1sYfffRRVq9e3en69evXk5jY90k0RUVFna4bVtPABMDdUs/atWv7/Njh1lWs0SqWYoXYildiHRixFCtENt7WVplIOVj0io7bIBUdIYQIhwFPdHJycqioqOhwXUVFBampqV1WcwBWrVrFypUrA583NjZSUFDAkiVLSE1NDTkGt9tNUVERixcvxmw2d7it5PVtsA+SzHDZsmUhP3a49RRrtImlWCG24pVYB0YsxQrREa9eURcDT9+42iOJjhBChMWAJzoLFizoVCkpKipiwYIF3R5jtVqxWjv/ojebzf36Y9/V8SZbsvbR64iqE5/+fq2DKZZihdiKV2IdGLEUK0Q23lj6PsU6n1NLdLxGmbgmhBDhEPIwgubmZnbu3MnOnTsBbXz0zp07KSkpAbRqzC233BK4/1e/+lWOHTvGt7/9bQ4ePMivf/1r/vGPf3DfffeF5yvoJ6NVa4Uz+xwRjkQIIUQ887n0REfW6AghRDiEnOhs27aNWbNmMWvWLABWrlzJrFmzePDBBwE4ffp0IOkBGDNmDGvWrKGoqIgZM2bw+OOP84c//CEqRksDmPyJjsnn7OWeQgghxMDRN64O7O8mhBCiX0JuXbv44otRVbXb21944YUuj9mxY0eoTzUoTNYkACyqJDpCCCEiyK1VdFTZLFQIIcJiwPfRiXZmW1ui01MCJ4QQQgwkxaO1UKtmSXSEECIc4j7RsSRorWs2XDg9vghHI4QQIl4p/tY1pKIjhBBhEfeJjl7RseHC4fZGOBohhBDxyuDVEh3FIomOEEKEQ9wnOiaLVtFJUFzYJdERQggRIUZ/65pi7vvG2EIIIdrEfaKDua11ze6SREcIIURkGL1aomOwSKIjhBDhIImOWRvjacMpFR0hhBARY/Lv56bv7yaEEKJ/JNHxV3QsiheHU0ZMCyGEiAx9PzdJdIQQIjwk0Wm3MZvb0RrBQIQQQsQzi7+io+/vJoQQon8k0WmX6DjtkugIIYQYfKqqYvZvXG2xSaIjhBDhIImOwYALCwBuR0uEgxFCCBGPXF4fNlwAmBMk0RFCiHCQRAdwGawAuJ2S6AghhBh8DpePBKSiI4QQ4SSJDuD2Jzoep7SuCSGEGHx2t5cEf0VH1ugIIUR4SKIDeA3aOp3WluYIRyKEECIe2d1ebIqW6GBOiGwwQggxREiiA6gm7Y9KS3NThCMRQgjRV8888wyFhYXYbDbmz5/Pli1bgjrupZdeQlEUrrnmmoENsAd2lzewRqf9kBwhhBB9J4kOoFi0RKe1RRIdIYSIRS+//DIrV67khz/8IZ988gkzZsxg6dKlVFZW9nhccXEx999/PxdccMEgRdo1u8sTWKOj7+8mhBCifyTRAQwW7Y+Kwy6ta0IIEYueeOIJ7rzzTm6//XamTp3Ks88+S2JiIs8991y3x3i9Xm666SZWr17N2LFjBzHazhwOBybFp30irWtCCBEWkugAJv8u1M5WmbomhBCxxuVysX37dhYtWhS4zmAwsGjRIjZv3tztcQ8//DBZWVl8+ctfHowwe+Rqv2G1VHSEECIsTJEOIBqYbckAGJwN+HwqBoMS4YiEEEIEq7q6Gq/XS3Z2dofrs7OzOXjwYJfHbNq0iT/+8Y/s3LkzqOdwOp04nc7A542NjQC43W7cbnfIMevH6B/tLQ0A+DDg9QF9eMyBdGa80UxiHTixFK/EOjCiJdZgn18SHcBSMAs+fZPzlV3UtLgYkWKNdEhCCCEGSFNTEzfffDO///3vGT58eFDHPProo6xevbrT9evXrycxse8VmKKiIgAOl1WyDHBgoeg//+nz4w00Pd5YILEOnFiKV2IdGJGOtbU1uC1hJNEBjGddDe+sZoFhP0eqyhiRMibSIQkhhAjS8OHDMRqNVFRUdLi+oqKCnJycTvc/evQoxcXFLF++PHCdz6etjzGZTBw6dIhx48Z1OGbVqlWsXLky8HljYyMFBQUsWbKE1NTUkGN2u90UFRWxePFizGYzvrc3QAV4jDaWLVsW8uMNtDPjjWYS68CJpXgl1oERLbHqVfXeSKIDMGwcR41jGec9BgfXwti7Ih2REEKIIFksFs455xw2bNgQGBHt8/nYsGEDK1as6HT/yZMns2fPng7XPfDAAzQ1NfH0009TUFDQ6Rir1YrV2rnabzab+/XHXj9e9WhtcR6DLapPdPr79Q4miXXgxFK8EuvAiHSswT63JDp+O5IvZFzDMdKOrwUk0RFCiFiycuVKbr31VubMmcO8efN46qmnaGlp4fbbbwfglltuIT8/n0cffRSbzcbZZ5/d4fj09HSATtcPFo9Ta8PwGGQPHSGECBdJdPyOjVgEDS+QVb0Z7HWQkBHpkIQQQgTp+uuvp6qqigcffJDy8nJmzpzJunXrAgMKSkpKMBiid9Co6tISHa9REh0hhAgXSXT8lBETOHC4gCmGk1r72qybIh2SEEKIEKxYsaLLVjWAjRs39njsCy+8EP6AQhBIdEyyh44QQoRL9L69NciyUmz8xztf+2T/G5ENRgghRFzxue3aR6noCCFE2Eii45eVYmWtb572ydF3wNEQ2YCEEELEDcWtVXRUkyQ6QggRLpLo+GWlWjmijuS4MhJ8bji0LtIhCSGEiBOKv6KDue978gghhOhIEh2/rBTtXbQ1Xn9VR9rXhBBCDBLFoyc6skZHCCHCRRIdvxEp2v4I/3b7E50jb4OzKYIRCSGEiBeK16F9tEhFRwghwkUSHT+b2UhagpmDagGutDHgdcLhtyIdlhBCiDhg0hMdqegIIUTYSKLTTlaKFVCoKLhcu0La14QQQgwCoz/RMVqloiOEEOEiiU47Wala+9qnwy7Trvi0CFwtEYxICCFEPDD7Ex2DtK4JIUTYSKLTjj6Q4FNlDGQUgseuJTtCCCHEADKpTu2jLSnCkQghxNAhiU47Wf6BBJXNLph6tXaltK+JMGt2ejjdYI90GEKIKGL2aRUds7SuCSFE2Eii044+ea2yydmW6Bx+C9xyUirC52t/3c7Fj23kRI20RQohwO31YVNdAJitUtERQohwkUSnnaxUrXWtstEBebMhrQDcLdqoaSHCwOH28uHRGpweH5uOVEc6HCFEFLC7vSQoWuuaOUESHSGECBdJdNrJal/RURRpXxNhd6i8Ca9PBWDXyfrIBiOEiAoOlxcrWkXHJBUdIYQIG0l02gkkOo1ar3Qg0Tm0DtyOCEUlhpK9ZQ2Bf+862dDDPYUQ8cLu9pLgT3RkHx0hhAgfSXTa0VvXWlxeWpweyJ8DqfngaoJj70Y4OjEU7CtrDPz7cGUTzU5PBKMRQkSD9q1rSKIjhBBhI4lOO8lWE4kWI+BvXzMYYMpV2o3SvibCYF9pWxVHVWHPKanqCBHvWl1tFR3MMnVNCCHCRRKdM3TbvnZwLXhcEYpKDAVur48D5U0ATMlNBWDXqfoIRiSEiAbt1+hIRUcIIcJHEp0z6JuGVjb52wgK5kNyDjgb4Ph/IxiZiHVHq5pxeXykWE0sn5ELyEACIQQ4nE6sir+NVRIdIYQIG0l0zjAitd3kNfC3ry3X/r3/9cgEJYaEfaXa+pwpeanMKsgAJNERQoDT0dr2iSQ6QggRNpLonKFtxHS7KWuB9rU14Grt4igheqdPXDs7L41pI9NQFChrcLS1SQoh4pLb0dz2ickWuUCEEGKIkUTnDHrrWlWjs+3K0QshbRTY62DjoxGKTMQ6feLaWXmpJFtNTMxKAWCXDCQQIq55nNobaE7Fpu3hJoQQIiwk0TlDh01DdQYjLHtM+/fmZ6BsZ6fjjle3MGP1ep4oOjwIUYpY4/Op7PcnOmfnpwEwo0D7KO1rQsQ3t791zW2wRjgSIYQYWiTROUNWahetawCTLoezPguqF968G7wd9z/ZcKCCBrubFz44jtvrG6xwRYwoqW2l2enBajIwboS28/mMgnQAdkqiI0Rc8zpbAPBIoiOEEGElic4ZOk1da++Kn4ItHcp3w0e/7nDT0Sqtx7rR4WFbcd1AhylijL4+Z3JuKiaj9t9uxsh0QBsx7fOpkQpNCBFhPv/aT49R1ucIIUQ4SaJzBr11rb7VjdPj7XhjchYs/bH273cfgdpjgZuOVLYtJn37QMWAxyliS/v1ObpJOSlYTQaaHB6O17REKjQhRIT5XHYAvEaZuCaEEOEkic4Z0hPNWPzvuFd1VdWZeROMuRA8dvjXvdr29sDRqrYT1bcPVKCq8g69aLO3tG3ims5sNATW68g6HSHil+rWKjo+qegIIURYSaJzBkVRGNHVQIK2O8BnntJGgB7/L+x6kdoWF7Ut2q7WFqOBEzWtHSo8Ir6patsggvYVHYCZ/nU6kugIEcfcWkXHJ6OlhRAirCTR6UJgIEFjF4kOwLBxcPEq7d9vfY/iE8UA5KcncN74YQAUSfua8CtvdFDT4sJoUJiUk9LhtsBAAhkxLUT88q/RUU3SuiaEEOEkiU4X9HU6VWdOXmtvwQrImQb2OjLffxCA8VnJLJqaDcDb+yXREZp9pVo1Z0JWMjazscNtM/0DCQ6UNXZeEyaEiAuKx/+3xpwY2UCEEGKIkUSnC/rktYruKjoARhNc9UtQDBSe/g8XG3YwPiuZyyZric6Ok/Vdr/ERcUefuDb1jLY1gILMBDISzbi8Pg6cbhrs0IQQUUDxaK1rmKV1TQghwkkSnS60bRraQ0UHIG8WLLgLgB+bn2NShkJOmo1p+WmoKrx7sHKgQxUxQJ+41n4QgU5RlED7mqzTESI+Gb3a3xpFKjpCCBFWkuh0oW3T0CAqMhd/j1Ilm3ylhgtPPQvAoilaVUfW6QiAff6Ja2cOItAF9tORREeIuKQnOgarJDpCCBFOkuh0IbBpaE+ta36tWPiO838AyD7wJzi5lUVTswDY9Gk1Dresu4hntS0uyhq0k5iuWtcAZo5KB2DnqfpBikoIEU30RMdokURHCCHCSRKdLvQ4XvoMx6pa2OSbxr+Ui1BQ4aUbmaqcIC/Nht3t5cOj1QMdrohi+/zrcwqHJZJiM3d5H72ic6yqhQa7e7BCE0JECZPPn+hIRUcIIcJKEp0u6K1rNS1OPF5fj/fV98t5dcQKyJ4GLZUoL3yGL486DUDRflmnE8/09Tln5Xden6PLTLIwKlM7wdkjY6aFiDsWf6JjkkRHCCHCShKdLgxLsmJQQFWhxr8RaHeOVmmJTk5ODtz2bxi1EJwN3HZsJZcZtrPhQAU+nzoYYYsotLeX9Tm6wECCIdq+VtPsxN3LmwZCxCOP14dF1boHTNakCEcjhBBDiyQ6XTAaFIYn97JpqJ9e0Rk3IhkS0uHmV2HiFRi9Tn5rfpLzW4rYUyrv0ser/T1MXGtvxkjt9p1DcCDBsapm5j2ygbv/viPSoQgRdRweHza0N9TMCckRjkYIIYYWSXS60TZ5recR03qiMz7L/wfKnADX/xVm3IhJ8fGE5VnqNjwxoLGK6NTs9HCsugXovaIzSx9IcLIeVR1aFcBtxXV4fSqbjlRLdVOIMzjcXhIUf6JjTYhwNEIIMbRIotONwOS1HgYSeLw+imu0E9lAogPaZqJXP8On424D4OLip+Ht1VovnIgbB05r1ZzcNBvD/BXC7pyVl4bRoFDV5OR0Qy/7N8UYvb2z2enhVJ09wtEIEV3sbi8J/oqO7KMjhBDhJYlONwKbhvbQunaithW3VyXBbCQv7Yx34gwGRnz2Z/zUc4P2+aYn4F/3gE/GTceLYNfnANjMRibnpABDbz8dPdEB2O9P/oQQGrvLiw3/3xlJdIQQIqwk0elGINHpoXXtqL9tbeyIJAwGpdPt6UlWthfcynfcd+LDAJ/8Cf55K7haByZoEVUCE9d6WZ+j0wcSDLX9dI5WtQT+fUASHSE6sLt92Pyta5ildU0IIcJJEp1ujEjtvXXtSNUZ63O6sHhKNi97L+EXwx4AowUO/At+dxGU7QxrvCL6hFLRAZjp309nKFV0nB4vJbVtib0kOkJ05GjXuiaJjhBChJckOt3ICmLT0MAgghHdJzqLpmYD8KvTU2i5/p+QnAPVh+EPl8H7j0srW5jsKKkL/DyigcPtDcTT0x467ekVnT2nGvAOkUX7JTWtHb6WA+WS6AjRnrZGR29dk0RHCCHCSRKdbuiJTlVj761rPVV0xgxPYtyIJDw+lXfsE+Hrm2HKcvB5YMPD8MKVUFcc1tjjzekGO1/47WZu+P1HvW7wOlgOVzTh8alkJJrJS7MFdcz4rGSSLEZaXF6OtWv3imX6+pzRw7S1Bydr7TQ53JEMSYioYne6sSn+/xOyRkcIIcJKEp1uZPlb16qanV2O+1VVNbD2oKdEB9qqOm8fqIDETPjCX+DqX4MlBUo2w2/Ohx1/A1XF4fbilCJPSHafasDtValqcrK3LDoqBu3X5yhK5/VbXTEaFKb599PZFSV7L7m9Pj4pqevzWGj9/8g5ozLI9Sd8h8qbwhafELHO7Ww3iVAqOkIIEVZ9SnSeeeYZCgsLsdlszJ8/ny1btnR73xdeeAFFUTpcbLbg3uGOpBH+ccBur0pda+d3oCsanTQ7PRgNCqOH9byb9eIpWqLz7sFKbXd4RYFZN8HXNkHBueBqgje+zqe/upalP/0XP9lllF3kQ3DwdNuJ84dHqyMYSZt9Zf71OfnBrc/R6e1ru05FR6Lzm41H+eyvP+TvW0r6dLxe9RyXlcyUXO17Iet0hGjjcrSr3pok0RFCiHAKOdF5+eWXWblyJT/84Q/55JNPmDFjBkuXLqWysrLbY1JTUzl9+nTgcuLEiX4FPRgsJgOZSRag68lr+vqL0ZmJWEw9fxtnjcogM8lCo8PD1uLathsyCnF86V9sGbsCN0Ym1LzLa9zPxe73KTuyG7zR3eLjcHupioJtUQ62W/fx4ZGaCEbSZm9paBPXdPpAgt1RkuhsOKj9v+5rAqm3ro0bkRQYn73/tFR0hNB5ndqwDrdiAYM0WQghRDiF/Fv1iSee4M477+T2229n6tSpPPvssyQmJvLcc891e4yiKOTk5AQu2dnZ/Qp6sOjrdCq62EvnSKV2sjaul7Y10FqSLp2cBcDb+7UTR5fHx18/OsFFj7/HF/Yv5Brnw5wwjCRbqecJy7OMf2UR/DgHfjUXXrpJW8+z62Uo2wGu6Fi/sfKfe/jfnSZ2RHhK2MF2rVBbi2txeiLb++fx+gLJ19lBTlzT6RWdQxXNuCLcwmh3ednnb6Hb34eWwPbtneNGSEVHiK54/BUdt6HnTYWFEEKEzhTKnV0uF9u3b2fVqlWB6wwGA4sWLWLz5s3dHtfc3Mzo0aPx+XzMnj2bRx55hLPOOqvb+zudTpzOtuSisVE7MXK73bjdoVc59GNCPXZ4slbROV3Xgtud3uG2wxVaTGOHJQb1uJdMHMYr209RtL+cqTlJPP3OUU76d4nPS7PxpUs/Q9bUm1j//PfJrt7MFFM5Fl+rNqGt+jAc/HeHx/MVnIt61ufwTblaW/cTgpoWF/e+vIsUm5lffXFGl3sA9eZ4dQtFB7SkbePBSmb5T9AHW6vLQ3GNdqKQbDXR7PSw9Vg188d0/p709XUQqk8rmnG4fSRZjOSnWkJ6vuGJRkYkW6hqdlHaOvCx9mR7cS0e/9qcE7Wt1DXbSbZ2/pXR3fe1otERaO/MTbXg9WoLrQ+VN+JwujD24XXXX4P1GgiXaIg3Vr5Xscrn0v4OeAzR39IthBCxJqREp7q6Gq/X26kik52dzcGDB7s8ZtKkSTz33HNMnz6dhoYGfv7zn7Nw4UL27dvHyJEjuzzm0UcfZfXq1Z2uX79+PYmJfZ9KU1RUFNL9XQ0GwMCm7btJKN/V4bYtB7Xbmk8fYe3aT3t9LKcXTIqRk3V27v+/vQCkmFWW5PtYmN2MqXwX68thg+ly3nRdyexkL/9vTDUpjjJSHGUkO8pIcWr/tnqaMJz8CE5+hPLWd6lIncHJjIVUpM3EZ7D0GEeTG57ZZ+S0XTvJfPzFdZyVEfpC81eLta8f4N3dx5jkPhLyY4TDiSZQVRMpZpUJyS4+cRr4y/ot1BR0v8Yp1NdBqLZWKYCRbKuHdev+E/LxOWYDVRg40awMeKw9KSrVvg4AVYU/vb6eMSk93P+MWA83aMdnWnxsWL8OnwpmgxG728dfXvsPWRFcjhDJ72tfRDLe1lbZ4Hgg+fwbSHuNUtERQohwCynR6YsFCxawYMGCwOcLFy5kypQp/Pa3v+VHP/pRl8esWrWKlStXBj5vbGykoKCAJUuWkJoaWisQaO9IFhUVsXjxYsxmc9DH7V//KVuqjpORN4ZlyyZ3uO1/92wEXFx72UJmjAxuHUZR006KDlSSajPxlQvGcPO5BSRaOv4IzPtO82bJHlrMqVx6zRVdfz2NZRj2v4Zh7ysYKvaQ2/AJuQ2foFpTUScvxzftOtRRC0Hp2JlY0+zk5ue3cdre1vq2xzWCby2bE1T8ulaXhwceew/wAFDusnLFFRcHPV0snF7edgr27mfG6OFccVY2n7yxn2pDJsuWzet0376+DkK18z+H4MgJzjtrdKfXTTBOJB1jz9tHONGksPiWRQMaa09e+8snQNvanPQx01g2r6DT/br7vtZ9XAL7DzJtdBbLls0C4PmTH7G7tJHsSbO54uycAf8ago01WkVDvHpFXQwM1a0nOjKIQAghwi2kRGf48OEYjUYqKio6XF9RUUFOTnAnLWazmVmzZnHkSPcVAKvVitXa+d0ts9ncrz/2oR6fk6794alpcXU4rsHupqpZ28l6Um5a0I/5k89N5zNHqrl4UhZpCV0fMylXS5qO19gxGE1dt/cMGw0X3KtdKvbDnn/A7n+iNJ5C2fU3DLv+BklZMHwiZIyG9FE02vL46XvNNNUmk5OSw+PXz+aW57aw+Vgth6taQ1o0/58dp2lyeBiZbuN0g526VjcVzR4KMgdgDwhVhYq90FQO4xdpE+va+bRSS9qm5qVxwcRsYD+7TjXg8ikkddFmBf1/HfXmgH/N0PSR6X16ntmjhwFHONakYDSaInKC6/Op7PQPRLhgwnDe/7SaQxUtPcZy5ve1uFYb4jEhOyVw/dS8NHaXNnK4spWrIphoDPRrINwiGW8sfZ9ikd665pOJa0IIEXYhJToWi4VzzjmHDRs2cM011wDg8/nYsGEDK1asCOoxvF4ve/bsYdmyZSEHO9iyUrSe6cozhhHoE9dyUm2k2II/CRiWbOXqmfk93ic/PQGzouLy+DhZ20rh8J5HV5M9FbIfgksfhJIPYffLsO8NaKnULic2AZAKPAlgA9VrQVlbwH/SUznUZKX2lVdgxhRIGg5JI7RL4nDtc1tah+RCVVX+vFmbmvelc0fx1/cPcapFmxIW1kSn8gDsfRX2vQo1/qR48mfgmt+Ara2qpycVk3NSGDUskZEZCZyqs7O1uJaLJ2WFL54gqaraYQ+dvphTmEGS1Ui908v2knoWThj8r+NYdTP1rW5sZgOfmz2S9z+tZn+IQwTaJq61DeyQgQRCnMEtiY4QQgyUkFvXVq5cya233sqcOXOYN28eTz31FC0tLdx+++0A3HLLLeTn5/Poo48C8PDDD3Puuecyfvx46uvreeyxxzhx4gR33HFHeL+SAZCVqlWVKps6Jjr63iC9bRTaF0aDQlYClLbCp5XNvSc6OoMBCs/XLlc8BuW7oe4EzRVHeG/LNtIcpyk0VpOnVKP4XFB7lInARCNQC7zbzeNaU7WqUEYhZIyhRM1iWEUzE0w5fG76eby34yCnWhR2n6rnyum5/fviq49oic3eV6HqQNv1RiuoPm0gwx8Ow/V/gxETUVWVg/4T5sk52gn0wnHD+Me2U2w+WhORROdkrZ0mhweL0cCE7L69PmxmI5eflc3/fVLGG7vKIpLobCuuA2DGyHSm+1szD5U34vWpQQ8RaNtDp+01rCc6B2XTUCEAUDz+7QtMMoxACCHCLeRE5/rrr6eqqooHH3yQ8vJyZs6cybp16wIDCkpKSjC02wugrq6OO++8k/LycjIyMjjnnHP48MMPmTp1avi+igGij5eubHKgqmpgDcqRqoFLdAByElVKWxWOVDazeGofRnGbbVAwj8q06Xyx6COONU0nL83Gi185FyXdCo2lUH8Cmip4vmgLrXXlXJCnMD3DDS3V0FKlfXQ1gbMRyvdoF2A08Bf/vAP1lyv5hWEEa03TKTtyIbgLQ9vZ2+uB8l1wbCPsey3wHAAYzFqr2tmfhYmXQ9Uh+Mct2gS6318K1z7L6dzLaHR4MBmUwMn0wnHD+ce2U3wQoY1D9/o3Cp2Uk4LZ2Pc9Ma6Zkcf/fVLG2r0VrL7ai81sDFeIQdl+Qkt05hRmMHpYEglmI3a3l+PVLUG97lucHsoatBO4scPb7j85V5tmUFpvp6HVTVqitEWJ+GbwaBUdNZTfnUIIIYLSp2EEK1as6LZVbePGjR0+f/LJJ3nyySf78jQRp7euOdw+mpweUv1tau13ex8IOQnaFLRPK/v+rndFo4MbfvcRx6pbyE9P4MU7z2XUMH9rWcZo7QLkGs7nq3/9hN9Xm9l8x2UkWNqdULtaoeEk1BVDXTH2iiN8uG07I6lggrkag9fBcG8Ft5iKoLYI9aePoIy9CCYsgYlLIe2MqXpuB5R9Aic+gBMfwskt4Gpuu91ggrEXw1mfhclXQkJ6220Fc+H//Rf+cavWovfyTbimfg0D5zFuRBpWkxb3gnHDANhX1kh9q4v0xJ6n0IWTqqq8sv0UAGfn961tTTevMIN0i0q9w8M7BytZNq2f1bIQ6YnOOaMzMBoUJuemsKOknv2nG4NKdI5Xa2unhiVZyEhq+xmk2szkpydQWm/nQHkj544dNjBfgBAxwuDVEh1FEh0hhAi7AZ+6FssSLEZSrCaanB4qG52BROdIu93eB0K2/++dvhYoVOUNDm74/Ucc9yc5L33l3G7XzyyemkNBZgIna+383yen+NK5o9tutCTCiEnaBXju3SM85jrEzIJ0Xv/6Qtz1pWx98w+UHN3Dhcon5Hlq4fA67bIGyD5bS3oMRi2xObUNvGdsvmpLg1ELYdLlMOWqnvcESs6CW9+E9Q/Ax89SuP83PGf+kHVZ/xu4S3aqjfFZyRypbOajY7VcPoiTvV7eepJ3DlZiMRq4bWFhvx7LYFCYM1zl7TKFVz8pHdREp6bZyTF/ojJ7VAYAU3NT2VFSz4HTjVw1I6/Xx+hqfY5uSm6qluiclkRHCL11TTEPwDAXIYSIc33vrYkTI1Lb2tcAHG4vJ2u1caAD2boGWqKjqqHvcfOjf+8PKskBbU3Q/5w3BoDnNh3H5+v6+bw+lb99pA0huPnc0dqAguRsqtJn8c+clSx0/pKii16FS38ABfO10dYVe2HTE/DeY1oVx+vUpsGddS0s+zl89QP4djHc+BKcc1twG58azXDFT+Ha3+FSrFxs3MWqk1+D8r2Buyz0V3U2D2L72omaFh7+934AvrV0EpNyethwJkhzR2h7AW08VElti6vfjxesT0rqAe31rVfE9LU1+8uCGyLQ1foc3VR/+5oMJBACTF7tb4vBIomOEEKEmyQ6vdDX6VT5BxIcr27Bp0KqzcSI5IHZ4G24FcxGhVaXN7DOIViqqvLRsRoAnrx+ZlCT0K6bU0CKzcSx6hbePVTZ5X02HKigrMFBZpKl09CBafmpgMKmxmy48H748nq4/whc+zuYfj3MuAGu+iXc/QncfxiuewHm3Qk5Z2tDFPpixvXcnfhTTvpGkOY4BX9cDB89C00VgUTng6M1fXvsEHl9Kiv/sYtWl5f5YzL58vljwvK4OYlwVl4KHp/Kmt1lYXnMYGw7UQvAnNEZgeum5oU2Le1olVYR6q6ioz2WDCQQwuTTfscbrZLoCCFEuEmi04szR0wfaTdxbaA2yDQaYLQ/Qfm0IrSTwVN1dmpaXJgMSmBaVm+SrSZunDcKgD+8f7zL+/zFX835wpyCTgvjp/nXo+zy77sCQNIwmHE9fPZ3cO2zMPsWGDau0z44feVweymqzWK5639xjr4Y3K2w7jvw+EQWfXATK0yvY6zaT2WDPSzP15Nn/3uU7SfqSLaaePwLMzAEOZUsGFf728Re3VEatsfszSft1ufoJuekoCjaBMKqM6YQdqW31jWAQxVNeLy+cIQsRMwyS6IjhBADRhKdXrSfvAZtJ3AD1bam0x8/1HU6u/3JxpTc1JAmdd26sBCjQWHzsRr2ljZ0uO1YVTPvf1qNosBN80d1Onb6SH9b0+lGXJ7BOXE9UtmMTwUlMRPLLf8HSx+FvNkAmE5v537TP3jL+l2SfnsO/Oc7cPRd8Ia//WtvaQO/KdrDfOUAL035kJH/uR1+MRveWAEnt2obnvbDZ6blYFBgR0l9YIH/QHJ6vIGEtX2ik2gxMWaY1obWW1XH61MDa3y6SnRGZSaSZDHi8vgG5WsSIlr5VDCr2u8lkyQ6QggRdjKMoBdn7qWjJx5dncCF03j/oINQE51dp+oBgq7m6PLSE7hyWi5v7irjuU3HeeL6mYHb/vpRCQCXTsrqshVudGYiqTYTjQ4Phyua+j1xLBgH2u2foxhNsODr2qXxNBxex6eb/klB3RaSWkvh42fh42cxWZK4jCRMpT8Bc6I2Clv/aElq+zwho/uLJUkbz33yYzwnPsK8/R12mI9jVrxwsF2AtUdhx19gxGSYdTPM+KK2AWtPfF5t/6Pj72E8sZkZNXayKq1cPD6ddz6t57UdpaxcPHHgvqnA3lItWc1MsjDmjD2cpuSlcqy6hQOnG7lw4ohuH6O0zo7L48NiMpCf0XmSlMGgMCknhU/8U9wmZPd/PZMQscjtg3S0vy0m28AMtxFCiHgmiU4vempdG0j6RLdPQ0x0dp6sB2BGQXrIz3nHBWN4c1cZ/9pdxneumEx2qo1Wl4d/bj8JwJcWjO7yOEVRmD4ynU1Hqtl1qn5QEh19w0l9X5aA1FyYczunUq7kquff5+rUw/zkrFI4vA6lpYpkWqCy63VIQTGYwOcBtP88kwAU8CXnYhh9Loycp22ueuBN2Pc6VB2E9d+Htx+Cycu0Fr6xl2iT6Hw+bWPU4+/B8ffhxCZwaNUUA1AI8NJGnjWn8qZ5Jtu2no968TcGdAyt3rY2e1RGp9bMqbmprNl9mv29VHT0qufY4Undbi46JTeVT0rqOVjexNVhiFuIWOTygQ2tomO2SqIjhBDhJolOL9q3rrVvyRms1rVPK5o6bFbaE69PDbSdzexDojN9ZDpzCzPYWlzHnzcX862lk3lzZxlNDg+jhyVy0YTu38WfPjKNTUeq2X2ygZvmh/zUITtYrp1sT8lJ7fL2uYWZuA0JvNQ4nbsuuIeC5b/AXb6fze+uY+HcmZh8Lm1dj9vuv7RoH51NYK8HRz3Y69ourbXgc2tJjmKkKWMqr1Tmsd03kRs/dx0Lz5nRMYDJy7TpcHtegU/+DKd3wv43tEvqSMibCSWbofWMgQnWVBh9Ht6C+ZTseo9C+14sLZV83vgen3e9h/dnv8A4+QqYerW2oWqYk57AIILCjE63Tc0NbiBBT+tzdFOCfCwhhjKXFxIU7U00mbomhBDhJ4lOLwKta41OTtW1BlpyRmYM7B+lMcMSMSjQ6PBQ1ewMVJZ6cqSymVaXl0SLsc+tdV8+fyxbi7fzt49LuOuS8fx5szaE4EvzR/e4yH76yHSgrXVuIKmqGpjY1ami45dsNTGjIJ3tJ+r48Gg1188dBSMmUZd8FHXMRWA2dzrG4/XR4vSSltj5NlRVS4zsdTSQzOW/3s5pj4Mb549i4TnTug7UlgZzv6xdTu/WWtl2vwyNp7QLaK1yoxbAmAtgzIWQMwOMJnxuN7trxzLy8qWYT2/n/Tf/yPiad8l118Kef2oXUwJkTYZhE2D4RBg+QbtkjgNz76+Xrr6v+kah7Seu6fTJa0erWnC4vd2uAWtr7+z+HeopMmJaCNztKjrhftNCCCGEJDq9ykrVThibnB72lmonZT215ISL1WxkVGYixTWtHKloDirR0ZOMaflpfY5v8dRsRmUmUlLbygOv7WX/6UasJgPXzRnZ43EzCrR2tU8rm7G7vCRYgh+EEKqqJie1LS4MCkzI6n59x3njhvkTnRot0emB2+vjlj9uYfOxGsYMT2L+mEzmjclk/thh5KcnaNPiLElgSeKhl3dyusFB4bBEvr9sSnBB506H3Mdg8Y/g4L+h4RSMOlcboGCydH+cwQiF52FYNomFf9jM+bZinj/3NKYD/4KGEijboV06UCB9lJb8JGeDx6Fd3Hb/x1ZwO8Bj1z4mpEP6KJptuVxrd1NuymKakg2taOuS/NXErBQrmUkWaltcHK5oCiS3ZwpUdHqoek7yV+IqGrWfZWZSD98DIYYolw8SJNERQogBI4lOL1KsJmxmAw73/2/vzuOirtYHjn9mhp1hR3YEFdyFcg0rW3CtzLTF1HvT6paVttt2u2nWLc3KLG+3fi223GtXK7M9S1HUzCUNJXdFEFEQQZEdBub7++PLjJIsA8wwM/S8X695ycx85zvPHHDOPHPOeY6RzUfUDSib+gBnTXEhPmQVlnMov5Shcc0sZAd2tWF9jom6gWgsz36z11zS+PrECPPGkY0J8/Wgk487p0qq2HPiLANjLdj8s5X21a3PiQ32bjKhSuoWzBtrD/NLRmGzG6/O+34/m+v2H8osKCOzoIxlv6prk6ICPBncJZBLugRRVVPLyrTjaDWwcOJFeLu38L+Qqwf0u6lljwEu6RpEiK8nG4u7sibqZkaPegEKD8OpA1BwUP254KB6qTwLRUfViyVK8+DUfnyAp02DWR8sUv9106tJk18UGr8onvBW2FzhScHuKvAeAL4RF5yuqT10TPTuLsQEeXG0sJx9ucVcasHf95+KsRaObUObvQX/srZV7hOOq9oIHhpJdIQQwlYk0WmGRqMhxMeD7NPl/FK3AWWcjSuumcSH6lmz76TFlddMIzqJjXzTbqmbB0bz6uqDlFSqi+5vS4pt9jEajYbEKD/W7MtnV45tE539ddOdTOs8GnNxZ3/cXbScKqnicH4psYENj4p9m36CJZvU/YMWTbwIHw8XtmWeZkvmaXYfP0vOmQpyzhzni9/O7WUz46o4+ne+cHqXrei0Gm64KJL/23CElWk5jO4bdm6q2vkUBcpOQcEhKDigri1y9VQvLp5qouXqBS4edbe5q+uEirJZt3U7Z3MzGOhbTJSmQE2Aqkshf696ASYCE92ALXUXNLjoQ7my1g2X3FeoQcd7hhJq3bT0WhUEOhfQaNWRKVcvdTqfuy94+DLTo5hfdTVU7MwBTTy4+4GH77ljLJ1+ZzSqcVYVQ1Wpeg59qPqcLVVdBsUn1Pbxj27549uiuhyOpMKB7+DAKigvQAcMQ4Px+ywYOVcdYRONevPNN3n55ZfJy8sjMTGRxYsXM3jw4AaPfffdd/n444/ZvXs3AAMGDODFF19s9HhbMNRq8KyruoarrNERQghrk0THAiE+7mSfLufIqfYpRGBiSqgO5Te/aWiloZb9detWTNPIWsvb3YXJQzrzf+uPkBjtTz8LS1UnRPmzZl8+6TZep2OquNYrrOmyxB6uOgbGBrDpcCG/ZBQSGxh5wTGH80t4/PN0AO69shs3XKwek9wrFIDSqhp2HD3DtsxCth45za6cIi6ODuCB5PgLzmVr4/uric7a/fkUlVc3PMqm0YA+RL3EXtqi88/f0JUDhhLeHjOAqL5h6rS2s8fUkaGzx+FsDkczD3A86xBd3IoIpwBqq9GU5uEHUJGNC9DftDvXsaaf72bgZldgd93lj3RudUlRXQLk7qsmL1Ul6qWyWP23uoH/Hxqtmuz4RoBPuPlfjXcooWcPo9l5GspOqqXCi0/UXY6bq94B4B8DXa+ALleo66f0IS1qT4uUFcDBVbD/e8hYq04nNPHwwxjaF+3RTejSPoKD38OoF6HfzS3beLf8tDryF5Nk/fgdyPLly3nkkUd4++23GTJkCIsWLWLUqFEcOHCAkJALf3epqalMmjSJoUOH4uHhwUsvvcTIkSPZs2cPkZEXvlfYQtX5a3RcWr6uTgghRNMk0bGAqSCBSXslOvGhlm8auje3mBqjQpC3m7qmpI0eTI7H01XH2MQLpyY1xrR3j2nTUls5fw+d5gztFlyX6BQweVD9Dy+lVTVM/88OyqtrSeoaxKMN7FGjd3fhiu6duKJu35iaWiM6rcaiKnjW1jPMl17hvuzLLebb9Fz+cknD5b5b42yFgYN1CbV5o1BXjwtGjSrzSpi8aAN6rQvps4ejrSikpjCTbRt+YvDAAWzOKODjXzLpG67nwau7qlOwFEWtVmcoUxOJymKoKib3ZD77snIIdaumTxDm26mqK1BQWw3lBerFEloXdapdVQkotVCSq17O4wJcAnCkifO4+agJR9FRtWLebx+rt3fqVZf4DIOYS9UPpuWFanxlBerPpn/LC9TqfbXV510M9X+uqVKfQzlvk12/zmrFvh7XQMxQao3wy6cLufTM52gKDsIXd0Haf+HahRAc1/hrqCyGAz/A7hVqAuWuh0cPNr0ezMktXLiQu+66i9tvvx2At99+m++++44lS5bw5JNPXnD80qVL611/7733WLFiBSkpKdx2223tErOhVjlvjY6M6AghhLVJomOB8wsBaDRcsJGirZjWOBSUVnOmrJqAJhZsp5+3PscaH8K93Fx4aHjLNqc0LU7PLCjjbIUBP88Gqpe1UXWN0bzYvbGKa+cb2i0IgM0ZhdQaz611UBSFJ1akk3GqjFBfdxZPvhgXnbax05hZcowtTbg4khdyi1mZdtyqiU5a9hkUBWKCvOjk497ocV07eeOm01JaVUNOURWdg0JQ3AM45ZuHEjeCjZmHWW0MIjImFvr0afI5a06Xc8eCdbgaNey5ezRuLnVtazSqozSVxWpiVFV8Lgky1taN7vjUXepGetx91Gl4Go16TNmputGaumSn+ASU5HL48AEqS07j3ymSqJg48ItSR3t8I8A3Uh398fBVk6WjmyFzvXrJ+13d8+jUPnUDWmsKS4Ce16rJTVi/+qM1RgOF+p7U3JiK67a3YMPLajxvJcFlj8BlD5+b4lddDod+VJObQ6vVwhMmvlFqewR2sW7sDqK6upodO3bw1FNPmW/TarUMHz6czZs3W3SO8vJyDAYDgYENT7utqqqiqqrKfL24WE3IDQYDBoOhxTEbDAaMRgNajfq+ZNC4QivO015Mr7E1r7W9Say240zxSqy24SixWvr8kuhY4PwPftEBXo2W1bU2b3cXIv09OV5UweFTpQzybnzdy666UZQEC6eZ2UKgtxvRgZ4cO13B7zlnuSze+gvMjxSUYqhV8Klrm+b0i/RD7+5CcWWNuSQ1wAebsvguPRcXrYZ/T+lPsL7xD/eOZNxFEcz7YR87jp7haGEZMUHWSbpNZaUHNFBW+nyuOi3dw/TsPl7M3txiOgfV/xY6w4LS0iZRAZ74eLhQUlnDkYLScyN0Wm3ddDU/oBXrZLQ68AlTL+cN4h08WcKobRtQFNAXuLBu2pWNJ3XuPtB9pHoBKCuErI11m7uuV4s/gDqK5BUEXsHgXfevVxB4B6vraVzc1Sl49S6u5372iwI/C6ZJ6dxg2CzoOwG+mwUZKbB+vlpmfOhMOPqLOv3NUHbuMUHx0PdG9TGderS8HZ1IQUEBtbW1hIaG1rs9NDSU/fv3W3SOJ554goiICIYPH97g/fPmzWPu3LkX3P7TTz/h5dXK0ZiaavOPP6xZh6Jx/C559erV9g7BYhKr7ThTvBKrbdg71vLycouOc/x3VQcQct6Hofaatnb+8x0vquDQyVIGNbHA3xoV16whIcqfY6cr2JVTZJNExzxtLdzHopErF52WIV0CSdmfz+bMQiJRP9S/+P0+AP5xbS8GxNiucIK1hfh6cGlcMBsPFfBl2gkeHG6dtULbs0z75zTfFr3Dfc2Jzui+YfXus2SzUBONRkOvMF+2ZZ1mX26xRVMR22LhTwcxFd8rraphwar9vHxzYtMPMvEOgj43qBdQEx+tTk3G2nMaY2BX+MsK2LMSVj0JpzPg24fP3e/fWU1u+ky4cHRINGr+/PksW7aM1NRUPDwaXivz1FNP8cgjj5ivFxcXEx0dzciRI/H1bfnfrsFgYOt7nwJQi44x117fuuDbicFgYPXq1YwYMQLXBvYhcyQSq+04U7wSq204SqymUfXmSKJjAdNeOtD+iU58iJ71B081WZDgbIWBIwXqN7ltrbjWVolRfnyXnmuzggSmggst+VA8NC6YlP35bDlymhG+8MLydGqMCtcnRjB1aKxN4rSl8RdHsvFQASvTcnggOa7NUxVrao3srEuUmxvRgXPV7vaeqP8mU1VjJPu0+g2LpSXYe4b71CU6JYy/uAVBt9CuY0Ws2pOHVgO3dKll2REdn+3IYdKQzq2rnucdZP0gLaXRqKM0ccmwbh4c3QSxl6kJTuSAP2VyExwcjE6n4+TJk/VuP3nyJGFhYY08SvXKK68wf/581qxZQ0JCQqPHubu74+5+4Qigq6trqzt7jbFuCojWAw8H/3Bj0pbX294kVttxpnglVtuwd6yWPrckOhaoN6LTTqWlTSwpSPB73bS16EBPu2+8aFqnY6uCBKY9dCxZn2NiWqfza9YZTnjqyC+pIj5Ez7wJ/exSVKCtRvUJw9N1N1mF5aQdK2pzmet9uSVUGGrx8XAh3oIEpXddomMaXTPJLizHqKgFHEKaWOdzvl6NnMvaXvnpAKBO/UvyyKbKL4KVaSeY89Uevpxxqc03ALYJDz8YM9/eUTgENzc3BgwYQEpKCjfccAMARqORlJQUZs6c2ejjFixYwAsvvMCPP/7IwIED2ynaczS16pqfGp1UXBPCVmpra6mtrbV3GE0yGAy4uLhQWVkpsdZxdXVFp2v7UhFJdCxw/oe29tos1MQ0gtRUomOt/XOsoW+kHxoN5J6tJL+ksl4hB2vY34KKayY9Qn0I9HbjdFk1hw0avN10vPWXAS3f7NNBeLu7MLpvGCvTjvPZ9pw2Jzo7jp4GoH/nALQWfODvWZecHC+q4Gy5Aa+6L1UyCkwbhXpbnEC2R6LzS0YBGw8V4KrTcP9VXfl9czaPjYhnzd58fj9+lk+3H2PS4M42e357S8s+w7EzFVzfggqKzuiRRx5h6tSpDBw4kMGDB7No0SLKysrMVdhuu+02IiMjmTdvHgAvvfQSs2fP5pNPPiE2Npa8vDwA9Ho9en37vM9ra9U1OrWS6AhhdYqi4OPjw5EjRxz+S01FUQgLC+PYsWMS63n8/f0JCwtr0/M45ye9dhbg5UYnH3fKq2roHtrOiU4ndeQi92wlJZUGfDwuHKozr89xgERH7+5CXCc9h/JLST92luG9rdeBF5ZWkV+ifgPas5k9dM6n1WpI6hrEd7+rpYbnje/T7lMQre2WgdGsTDvO1zuP849re7Upadt+1LQ+x7KEyc/TlagAT3LOVLAvr5gB0WqyYtpnqiVfBvQI9UGrUSsL2iIxVhSFl39UR3MmDe5MdIAXv6MWGHloRHee/3YvC1btZ0zfsIb3JXJiFdW1vLbmIO9tPIKHq46Lo/2JDuy4JYwnTpzIqVOnmD17Nnl5eVx00UWsWrXKXKAgOzsbrfZc1cS33nqL6upqbrrppnrnmTNnDs8++2y7xKwxSqIjhK3k5+cTEBBAp06d0Ov1Dp1AGI1GSktL0ev19d6nHFF7xKooCuXl5eTn5wMQHh7e6nNJomMBrVbDyvuGUl1jbDDRsCU/L1dCfNzJL6ki41QZFzVQbMA8omPnQgQmCVH+aqKTU8Tw3qHNP8BCB+qmrcUEebX4g/34iyP5fncuIyKMjOnb9Jx9Z3BJ10C6BHuTWVDGN7tOcGsbRiTMFddiLR8Z6h3uS86ZCvaeOC/RMY/oWJ7oeLrpiA325sipMvblllg90UnZl09adhEerlpmXlV/35nbkmJY/ms2B0+W8upPB3n+hr5WfW572nqkkCdWpJNVqK6ZGtUnDL2TjmC2xMyZMxudqpaamlrvelZWlu0DaoZOURMdo0vb9z4TQpxTW1tLcXExwcHBBAUFOUXyUF1djYeHh8Rax9NTfV/Mz88nJCSk1dPYHLs1HUhUgBdd23l9jolp9OHQyQsLEuSdreRkcRVaDfSNtG3VKkslRqslrndZeZ2OeX1OC0ZzTIb3DuX3Z5K5trOx+YOdgEajYdJgtfTyJ9uyW32eE0UV5J6tRKfVNJhEN8ZckOC8KWetSXTOP5e1p68ZjYp5bc7tl3apV1QE1FLZz16v7vWzdOtR9pyw7Ua37aG0qoZnvtzNxHe2kFVYTpivB0umDeS1iRc1uQ+XsA9d3RodRRIdIazKtMeKm5u87zkzU+n+tuzZI4mOE4hvYp2OaTSne6gPXm6O8Y3tuYIERSiK0vTBLdCa9Tnnc2+n/Y/ay00DonHTaUnPOcvu4637kG6attY73LdFfz+9I+onJ4pybupaXEjL9vZprLhBW32TfoL9eSX4eLgwfVjXBo8Z2i2YaxPCMSow56s9Vv17bW8bDp5i1Gsb+M+WowBMGhzNT48M4+qe1htVFdblWjeiI4mOELbhyNPVRPOs8fuTRMcJxIWqIxgNJTrpDlSIwKRXuA+uOg1nyg3knKmw2nn35RWbzy/UDVpH1U3Da+2ozo4stRCBJWWlz2dKTg6dLMVQa+RsNZRV16LTaugc2LJEx/T73J/beAn1ljLUGlm4+iAA04d1bXL9zdPX9MLTVcf2o2f4cudxq8XQXs6WG3jss13ctmQbx4sqiA70ZOnfhjBvQgK+7TzVVrSMtq68NK6yRkcIIWxBEh0nYCppfaihEZ1j6jf5CXXTxRyBu4vOPOqyy0r76dTUGjl4Un39tt5Y0pmYpq99lXacsqqaFj9+R3bd+pwWJjpRAZ74uLtQXWvkyKkyTlaq37rEBHrh5tKytxXT1LWMU6VU1VinVOVn23M4WlhOkLcbt1/apcljI/w9mXm1un7nxe/3U1LZ+iHy9vZr1mlGvLaez3bkoNHAtKGxrHpwGJfGWX+zXmF9roo6dU3j1nGLRAgh7Cc2NpZFixbZOwy7kkTHCZj20jl2ppxKw7kPgkaj4lClpc+XEKUmXtbaTyersIzqGiOerjo6d+DKUS2V1DWILsHelFXX8s2uEy16bFlVDfvqRlEGtqAQAajDyb1M09fySsivG7hrzTq2MF8P/DxdqTEqHDrZeBl1S1Uaankj5RAAM66Ks6hwxd8u70JskBenSqrMj3V0NbVGHvl0J/klVXQN9uaz6Uk8e30fpy2b/mfkWld1Tesq72lCCNWVV17JQw89ZJVz/frrr9x9991WOZezkkTHCQR5uxHg5YqiqN96m2QVllFSWYO7i5YerVigb0umxMtU+rqtTB/Ie4T5WLTXy59FW4oSrPgth1qjQqS/J+F+LV8jcG5tTQknK9TfSbcWrs+BuqSpbvraTiv8vfxn81HyiiuJ8PNgyiWWVaNzd9ExZ6xamOCDTVkczrfeNDpb+XrXCY6driDI241v7r+MgbGB9g5JtJAr6oiO1l0SHSGEZRRFoabGshkcnTp1Mi/o/7OSRMcJaDQa4kMuXKdjGs3pE+GLq86xfpWmqXS7j5+l1tj0Am9LpivtN6/PkWlrf3Rj/6gWFyXIO1vJglVqRbK7G1mo3xxTorM/r4STdSM6La24ZjK0mzrVauHqg+SdrWzVOQBKKg38O/UwAA8N7467i+UFKK7qGcLwXiHUGBXmfO3YhQmMRoU316mv847LusgojpNyVdRpkjo3KUYghIDbb7+d9evX8/rrr6PRaNBoNHz44YdoNBp++OEHBgwYgLu7Oz///DMZGRmMGzeO0NBQ9Ho9gwYNYs2aNfXO98epaxqNhvfee4/x48fj5eVFfHw8X3/9tUWx1dbWcuedd9KtWzfCw8Pp1asXr7/++gXHLVmyhD59+uDu7k54eHi9kv9FRUVMnz6d0NBQPDw86Nu3L99++23rGstCjvXpWDSqm7nE9HmJTt36HEfZP+d8cZ30eLrqKKuu5cipC6cj1RoVUvadZNoH2+j5zCr+9tH2Jj/gmhaqSyGCCwXp3VtclGDO17sprarh4s7+/OWSmFY9b+/zpq6ZR3RamejcPawrvcN9OV1WzQP/S6OmtnVlwN//OZMz5Qa6BnszoX9kix//zHW9cXPRsulwIb9kFLYqhvawak8eGafK8PVw4bak1v3+hH0pioJb3RodnXvLR0KFEC2jKArl1TV2uVj6xdmiRYtISkrirrvuIjc3l9zcXKKj1VkbTz75JPPnz2ffvn0kJCRQWlrKNddcQ0pKCmlpaYwePZqxY8eSnd3054C5c+dyyy23kJ6ezjXXXMOUKVM4ffp0s7EZjUaioqJYvnw5W7Zs4R//+Ad///vf+fTTT83HvPXWW8yYMYO7776b33//na+//pq4uDjz48eMGcOmTZv473//y969e5k/f36r98exlHwN6CRMJaYPnTelxlHX5wC46LT0jfTl16wz7Mo5S3xd5bjTZdUs//UYS7cerVeRbc2+k2zNLOSZa3tz88CoC0oK7jfvoSMjOg2ZNDiab3ad4Ku04zx9Ta8mv+FftTuPH/ecxEWrYd6EfuhaORUwLkSPTqtW1wNTotO6D2werjrenNKfsYt/ZlvWaRauPsjjo3u26Bx5Zyt5b2MmAI+M7I5LK0Y5Y4K8mTy4Mx/+ksXraw4xtFuQw5UnVRSFf61VR3OmDY1t902MhXVUGox4atQ1Oi4ekugIYWsVhlp6z/7RLs+997lRFm3h4Ofnh5ubG15eXoSFqV9g7t+/H4DnnnuOESNGmI8NDAwkMTHRfP35559n5cqVfP31141unAwwbdo0Jk2aBMCLL77IG2+8wbZt2xg9enSTsbm6ujJ37lyMRiPFxcX069ePrVu38umnn3LLLbcA8M9//pNHH32UBx980Py4QYMGAbBmzRq2bdvGvn376N69OwBdu7ZuRklLyIiOkzAVJDBNXauuMbLnhDqdyxFHdKD+fjpp2Wd4ZPlOLpmXwkur9pNzpgI/T1fuurwLH98xmMQoP0oqa3h8RTq3LdlGzply83nOlhs4XqQmRY62FslRWFqUoKTSwLNf7wHUUZS2JI4erjpzRUBQ15I1Vca5OV2CvZk3oR8A/07NIPVAvsWPzTlTzsR3NlNaVUPfSF+u6Rve6jimX9EVN52WbVmn2XKk+W+52tu6A/nszS3Gy03XbEU54bgqDLV4oiY6rjKiI4RoxsCBA+tdLy0tZdasWfTq1Qt/f3/0ej379u1rdkQnISHB/LO3tze+vr7k51vW37755psMGjSIuLg4fH19eeedd8zPl5+fz4kTJ0hOTm7wsTt37iQqKsqc5LQXGdFxEnF1IzpZheVU1xg5eLKE6hojvh4uxAY55kIzU+W1pVuz+XjzUfPt/SL9+GtSDNcnRuBRt4nn0G5BvP9zJgtXH2TjoQJGvbaBJ8f0ZMqQGPP6nEh/T/w85dvrhpiKErz4/X4+2ZbNrYMbXoT/yo8HyCuuJCbIiweS49v8vL3CfThwUh1t69rK0ZzzjU2MYGtmIf/dks3Dy3fy/YOXN1so4WhhGZPf3WreQ+atKQPaVLAi3M+TiYOi+c+Wo7yRcoikbkGtPpe1nT+a85dLYgjwll2/nVWloRaPukRHK2t0hLA5T1cde58bZbfnbitv7/p97KxZs1i9ejWvvPIKcXFxeHp6ctNNN1FdXd3keVxd63+O0mg0GI3NTxdftmwZs2bN4pVXXqFfv36EhYXx6quvsnXrVgA8PZt+H2vufluRRMdJhPl6oHd3obSqhqzCMnN1qsRof4ebWmPSv7NasrjWqODmomVsQgS3JcU0OALlotMy/YpujOgdyhMr0vk16wzPfLWHb9Jz6RepJkw9ZTSnSTf2j+LlHw+YixL0jay/t9Jv2Wf4eIuacL44vp85yWyL3hG+fLlTHUHqGmydb6X/cW1v0rKL2HOimPs/SWPZ3Zc0Og3tcH4Jk9/dai6x/MldlxDm1/bNF++5shvLfs1m85FCtmWeZnAXx6hotvlIIb9lF+HmouVvl8tojjOrMBjx1KhrdHCVREcIW9NoNBZNH7M3Nzc3amubL9K0adMmpk2bxvjx4wF1hCcrK8tmcW3atImhQ4dy7733UlxcjK+vLxkZGeb7fXx8iI2NJSUlhauuuuqCxyckJJCTk8PBgwfbdVRHpq45CY1GYx7VOZxfSroDr88xiQ704rWJicy+rjdbnkrm1VsSm51m17WTnuV3JzH3+j54uenYlnma939W1130lEIETQrSuzOqT8NFCQy1Rp5a8TuKoiZE1tpQsnf4uWSqtetz/sjDVcebk/ujd3dh+9EzvLr6YIPH7T1RzMT/20J+SRU9Qn1YPj3JKkkOqKOHNw1QF4AuXus4++qYRnNuHRRNiI91Xquwj/NHdJB9dIQQdWJjY9m6dStZWVkUFBQ0OtoSHx/PF198wc6dO9m1axeTJ0+2aGSmteLj49m+fTs//vgjhw8fZvbs2fz666/1jnn22Wd59dVXeeONNzh06BC//fYbixcvBuCKK65g2LBh3HjjjaxevZrMzEx++OEHVq1aZbOYQRIdpxJ3XuU1U8U10/QwRzX+4ijuuKwLgS2YYqPVapg6NJYfHxrGpXHnpg1JaenmTR6iTln7Ku04ZVXn6uy/s+EIB06WEOjtxtPX9rLa851fBa9rsPU+rMUGe/PSjeo84rdSM1i3v/784fScIia9u4XCsmr6Rvryv7svoZOPu9WeH+C+K7vhotWw8VABO46eseq5W2PH0TP8klGIi1bD9Cu62Tsc0UbqGh0Z0RFC1Ddr1ix0Oh29e/emU6dOja65WbhwIQEBAQwdOpSxY8cyatQo+vfvb7O4pk+fzoQJE5g0aRLDhw+nsLCQ++67r94xU6dOZdGiRfz73/+mT58+XHfddRw6dO7LwhUrVjBo0CAmTZpE7969efzxxy0avWoLxx/DE2amymu7corM1dcuctBCBNYQHejFf+8cworfjrP7+FmG9wq1d0gOL6lrELFBXmQVlvPNrhPcOrgzmQVlvJ6ivtE8c12vFiWdzQnSu9MnwofDJ4vpG2HdRPTahHC2Zsbw8eajPPLpTr574HIi/D3ZcfQ005b8SkldeewPbx9sk7Vb0YFeTOgfyafbc3gj5RAf3THY6s/REqZ9cyb0jyTSXz4YO7uK6vNGdFzk9ymEUHXv3p3NmzfXu23atGkXHBcbG8vatWvr3TZjxox61/84la2hMtdFRUUWxeXu7s4HH3zA+++/b566ptVqmTdvXr3jpk+fzvTp0xs8R2BgIEuWLLHo+axFRnSciKny2oaDpzAq6rqdEN+OPX1Fo9Fw04Aonr2+j1XWlHR0alECdVTnk23ZKIrC0yt/p7rGyOXxwdxwUcv3lmnOh1MH8vfEWoL01h1RAfj7Nb3oG+nLmXID9/8vjQ0HT/HX97dRUlXD4C6B/OfOITYtUDHjqjh0Wg3rD54yr4uzhz0nilm7Px+tBu69Ms5ucQjrqTDUmstLy4iOEELYhiQ6TiSukzpNqMaoZuSJ0Y49bU3Yx00DonDVaUjPOctz3+7ll4xCPFy1vHBDP5sUrvD3csXf+jkOcG69jo+7CzuOnuG2Jdsor67l8vhgPrp9MPom9guyhpggb3NyuDjFfmt13t6grlO7LiGCLlYq+iDsq8JgPG+NjiQ6Qgj7uueee9Dr9Q1e7rnnHnuH12oydc2JRAZ44uGqpdKgLjZz1P1zhH2ZihJ8m57LB5uyAHhoeHc6O2gZ8ubEBHnz0k0J3Lf0NwCG9wrhX5P7t9sI34yrurEyLYeU/fkNVrOztbxy+HHvybpYZDSno6ist0bHOf9vCiE6jueee45Zs2Y1eJ+vr/OukZZEx4notBq6ddKf2yjUgSuuCfuaPLgz36bnAmoRhzsvc+5SxNf0C2fBTQmcPFvJ9Cu64ebSfoPRXTvpuT4xgi93nuCNlEO8c9vA5h9kRWuOa1EUGNk7VDbM7UAqqypx0dRVSHLt2FOQhRCOLyQkhJCQEHuHYXUydc3JmAoSAPRz8Iprwn6SugXRO9wXN52WeRP64drIPjTO5JaB0dyfHN+uSY7JzKvj0Gjgp70n2Vv3RUN7yD5dzo4CjTkG0XHUVpafuyIjOkIIYRMyouNkTCWmu3byxtfDdouwhXPTaDQsm34JpZU1REiFrjaLC/Hh2n7hfJuey+K1h3jrLwPadD6jUeG5b/eyP6+YqAAvogO8iA70JDrQi6gAT0J9PNBqNbyzMQsjGi6PCyJBRnA7FENVGQBGtGh11quEKIQQ4hxJdJzMyD5h/N/6I9w0IMreoQgH5+vhKsmwFT2QHM+36bn8sDuPA3klbZpG9u7GI3z4S1bdtdMX3O+m0xIZ4EnOGfVb/3uv6Nrq5xKOyVit/m4NWg/cbVAkRAghhCQ6Tqd7qA+/zx1l7zCE+NPpHurDNf3C+P73PBavPcS/JrduY7b0nCJe/vEAAHcP64qPuws5Zyo4dqacY2fKOVFUSXWtkcwC9Rv/OF+FQbEBVnsdwjHUVleo/2ptVLJQCCGEJDpCCGGpmVfF8/3veXz3ey4P5ZcQF9KyUZ3Sqhoe+F8aNUaFMX3DeGpMzwtKftfUGskrruTY6Qpyi8qoyEyz5ksQDmJcL384BK4eUi5cCCFsxflXKAshRDvpHeHLyN6hKArM/moPlYbaFj1+zld7yCosJ8LPg/kTEhrc18hFpyUqwIukbkGMTQhHL7MPO6TOddVaXTykEIEQwnpiY2NZtGiRvcNwGJLoCCFECzwysjserlp+ySjkjg9/payqxqLHfbXzOCt+y0GrgUW3Xoyfl2Qwf2oGdeqa4iLFQoQQwlYk0RFCiBboGebLR7cPxttNxy8Zhdy2ZBtnKwxNPubY6XL+sXI3ADOvjmdwl8D2CFU4sppK9V9XSXSEEMJWJNERQogWGtI1iKV3XYKvhws7jp5hyntbOF1W3eCxhlojDyxLo6SqhoExATwg++EIMI/oSKIjhDB55513iIiIwGg01rt93Lhx3HHHHWRkZDBu3DhCQ0PR6/UMGjSINWvWtPr5Fi5cSL9+/fD29iY6Opr77ruP0tLSesds2rSJK6+8Ei8vLwICAhg9ejRFRUUAGI1GFixYQFxcHO7u7nTu3JkXXnih1fHYgiQ6QgjRChdF+7Ps7iSCvN3YfbyYW9/ZTH5x5QXHvb7mEGnZRfh4uLDo1otw6QCbt4q20xjqNgyVqWtCtA9Fgeoy+1wUxaIQb775ZgoLC1m3bp35ttOnT7Nq1SqmTJlCaWkp11xzDSkpKaSlpTF69GjGjh1LdnZ2q5pEq9XyxhtvsGfPHj766CPWrl3L448/br5/586dJCcn07t3bzZv3szPP//M2LFjqa1V16c+9dRTzJ8/n2eeeYa9e/fyySefEBoa2qpYbEWqrgkhRCv1jvBl+fQkpry3hYMnS7nl/zaz9K5LiKzbpHVzRiFvph4GYN6EfkQFyMJzUUdGdIRoX4ZyeDHCPs/99xPg1nyFxYCAAMaMGcMnn3xCcnIyAJ9//jnBwcFcddVVaLVaEhMTzcc///zzrFy5kq+//pqZM2e2OKyHHnrI/HNsbCz//Oc/ueeee/j3v/8NwIIFCxg4cKD5OkCvXr0oLi6mpKSE119/nX/9619MnToVgG7dunHZZZe1OA5bkq8WhRCiDeJC9Hw2fShRAZ5kFZZzy9ubySoo40xZNQ8v34miwC0Do7guwU4drHBMpjU6Lh72jUMI4VCmTJnCihUrqKqqAmDp0qXceuutaLVaSktLmTVrFr169cLf3x+9Xs++fftaPaKzZs0akpOTiYyMxMfHh7/+9a8UFhZSXq6OOJtGdBqyb98+qqqqGr3fUciIjhBCtFHnIC8+uyeJKe9u5UhBGTf/32a6h+rJK66ka7A3z17fx94hCkdjqrrmKqN8QrQLVy91ZMVez22hsWPHoigK3333HYMGDWLjxo289tprAMyaNYvVq1fzyiuvEBcXh6enJzfddBPV1Q2vEW1KVlYW1113Hffeey8vvPACgYGB/Pzzz9x5551UV1fj5eWFp2fjI85N3edIJNERQggrCPfzZPn0JP76/lb255VwqqQKV52GNyZdjJebvNWKPzCt0ZGpa0K0D43Goulj9ubh4cGECRNYunQphw8fpkePHvTv3x9QCwNMmzaN8ePHA1BaWkpWVlarnmfHjh0YjUZeffVVtFp1gtenn35a75iEhARSUlKYO3fuBY+Pj4/H09OTlJQU/va3v7UqhvYgU9eEEMJKOvm4s+zuS0iM8gPgqTG96BvpZ+eohEOSNTpCiEZMmTKF7777jiVLljBlyhTz7fHx8XzxxRfs3LmTXbt2MXny5AsqtFkqLi4Og8HA4sWLOXLkCP/5z394++236x3z1FNP8euvv3LfffeRnp7O/v37eeuttygsLMTDw4MnnniCxx9/nI8//piMjAy2bNnC+++/36bXbm2S6AghhBX5e7mx4t6hpM66kjsu62LvcISDMl5yH790exxjnxvtHYoQwsFcffXVBAYGcuDAASZPnmy+feHChQQEBDB06FDGjh3LqFGjzKM9LZWYmMjChQt56aWX6Nu3L0uXLmXevHn1junevTs//fQTu3btYvDgwSQlJfH111/j4qLOUnjmmWd49NFHmT17Nr169WLixInk5+e3/oXbgMynEEIIK3PRaYkNdvwpEsKOArtxyrcvBHa1dyRCCAej1Wo5ceLC9USxsbGsXbu23m0zZsyod70lU9kefvhhHn744Xq3/fWvf613/YorrmDTpk3m60ajkeLiYnOcTz/9NE8//bTFz9neZERHCCGEEEII0eFIoiOEEEIIIUQHsnTpUvR6fYOXPn3+PJVAZeqaEEIIIYQQHcj111/PkCFDGrzP1dW1naOxH0l0hBBCCCGE6EB8fHzw8fGxdxh2J1PXhBBCCCGEEB2OJDpCCCGEEKLDURTF3iGINrDG708SHSGEEEII0WGY1qBUV1fbORLRFuXl5UDb1hTJGh0hhBBCCNFh6HQ6fH19OXXqFB4eHuj1ejQajb3DapTRaKS6uprKykq0Wsceg2iPWBVFoby8nPz8fPz9/dHpdK0+lyQ6QgghhBCiQwkJCeHgwYO4u7tTUFBg73CapCgKFRUVeHp6OnRCBu0bq7+/P2FhYW06hyQ6QgghhBCiQ9FoNJSUlDB06FB7h9Isg8HAhg0bGDZsmMOXfm6vWF1dXds0kmMiiY4QQgghhOiQdDqdwycPOp2OmpoaPDw8JFYrc+yJgEIIIYQQQgjRCpLoCCGEEEIIITocSXSEEEIIIYQQHY5TrNExbRhUXFzcqscbDAbKy8spLi52+PmEEqvtOFO8EqttOFOs4Bjxmt53ZeO9+v5M/RI4V7wSq+04U7wSq204SqyW9k1OkeiUlJQAEB0dbedIhBDiz6mkpAQ/Pz97h+EwpF8SQgj7a65v0ihO8DWd0WjkxIkT+Pj4tKpmd3FxMdHR0Rw7dgxfX18bRGg9EqvtOFO8EqttOFOs4BjxKopCSUkJERERDr+RXXv6M/VL4FzxSqy240zxSqy24SixWto3OcWIjlarJSoqqs3n8fX1dfg/IBOJ1XacKV6J1TacKVawf7wyknOhP2O/BM4Vr8RqO84Ur8RqG44QqyV9k3w9J4QQQgghhOhwJNERQgghhBBCdDh/ikTH3d2dOXPm4O7ubu9QmiWx2o4zxSux2oYzxQrOF6+wnLP9bp0pXonVdpwpXonVNpwpVnCSYgRCCCGEEEII0RJ/ihEdIYQQQgghxJ+LJDpCCCGEEEKIDkcSHSGEEEIIIUSH86dKdDQaDV9++aW9w7CIM8X6R1lZWWg0Gnbu3GnvUJrlTLECpKamotFoKCoqsncozZJYbcOZYhWWcZb3e2eJszHO9H7vTLGCc70vOUuszhKniaPG2+ESnTfffJPY2Fg8PDwYMmQI27Zts3dIDXr22WfRaDT1Lj179rR3WABs2LCBsWPHEhER0WDHpigKs2fPJjw8HE9PT4YPH86hQ4ccMtZp06Zd0M6jR4+2S6zz5s1j0KBB+Pj4EBISwg033MCBAwfqHVNZWcmMGTMICgpCr9dz4403cvLkSYeM9corr7ygbe+55552jxXgrbfeIiEhwbyBWVJSEj/88IP5fkdpV0tidaR2FdbjDH2TI/dLIH2TrUjfZBvO1C9ZEq+jtGtLdahEZ/ny5TzyyCPMmTOH3377jcTEREaNGkV+fr69Q2tQnz59yM3NNV9+/vlne4cEQFlZGYmJibz55psN3r9gwQLeeOMN3n77bbZu3Yq3tzejRo2isrKynSNtPlaA0aNH12vn//3vf+0Y4Tnr169nxowZbNmyhdWrV2MwGBg5ciRlZWXmYx5++GG++eYbPvvsM9avX8+JEyeYMGGCQ8YKcNddd9Vr2wULFrR7rABRUVHMnz+fHTt2sH37dq6++mrGjRvHnj17AMdpV0tiBcdpV2EdztQ3OWq/BNI32Yr0TbbhTP2SJfGCY7RriykdyODBg5UZM2aYr9fW1ioRERHKvHnzFEVRFEBZuXKl+f7Zs2crYWFhyq5du9o7VGXOnDlKYmJio/c7Sqx/jMNoNCphYWHKyy+/bL6tqKhIcXd3V/73v/8piqIomZmZCqCkpaUpiqIoNTU1yu2336706NFDOXr0aLvFqiiKMnXqVGXcuHGNPsZesSqKouTn5yuAsn79ekVR1HZ0dXVVPvvsM/Mx+/btUwBl8+bNiqIoyrp16xRAOXPmjKIoilJWVqaMHj1aGTp0qPm29ohVURTliiuuUB588MFGH2OvWE0CAgKU9957z6Hb9Y+xKorjt6toOWfpm5ylX2ooFumbrEf6Jttxpn7p/HgVxbHbtSkdZkSnurqaHTt2MHz4cPNtWq2W4cOHs3nz5nrHKorC/fffz8cff8zGjRtJSEho73ABOHToEBEREXTt2pUpU6aQnZ19wTGOEqtJZmYmeXl59drZz8+PIUOGXNDOAFVVVdx8883s3LmTjRs30rlz5/YMF1DnjYaEhNCjRw/uvfdeCgsLGzyuvWM9e/YsAIGBgQDs2LEDg8FQr2179uxJ586dG2zboqIiRowYgdFoZPXq1fj7+7dbrCZLly4lODiYvn378tRTT1FeXt7g49sz1traWpYtW0ZZWRlJSUkO3a5/jNXEEdtVtI6z9U3O2C+B9E3WJH2T9TlTv9RQvCaO1q6WcLHbM1tZQUEBtbW1hIaG1rs9NDSU/fv3m6/X1NTwl7/8hbS0NH7++WciIyPbO1QAhgwZwocffkiPHj3Izc1l7ty5XH755ezevRsfHx+HivV8eXl5AA22s+k+k9LSUq699lqqqqpYt24dfn5+7RanyejRo5kwYQJdunQhIyODv//974wZM4bNmzej0+nsFqvRaOShhx7i0ksvpW/fvoDatm5ubhe8ITTUtnl5eUycOJH4+Hg++eQT3Nzc2jVWgMmTJxMTE0NERATp6ek88cQTHDhwgC+++MIusf7+++8kJSVRWVmJXq9n5cqV9O7dm507dzpcuzYWKzheu4q2caa+yVn7JZC+yVqkb7IuZ+qXmooXHKtdW6LDJDqWevjhh3F3d2fLli0EBwfbLY4xY8aYf05ISGDIkCHExMTw6aefcueddwKOE2trTZo0iaioKNauXYunp6ddYrj11lvNP/fr14+EhAS6detGamoqycnJ5vvaO9YZM2awe/fuVs9/HzFiBIMHD2b58uX1OkVbaCzWu+++2/xzv379CA8PJzk5mYyMDLp169busfbo0YOdO3dy9uxZPv/8c6ZOncr69etbdA57x9q7d2+Ha1fRPhzh/f7P0C+B9E1Nkb7JupypX4KO2Td1mKlrwcHB6HS6CypWnDx5krCwMPP1ESNGcPz4cX788cf2DrFJ/v7+dO/encOHD5tvc8RYTW3ZXDsDXHPNNaSnpzc4DGsvXbt2JTg4uF47Q/vGOnPmTL799lvWrVtHVFSU+fawsDCqq6svKM3YUNtee+21bNiwgb1799ol1oYMGTIE4IK2ba9Y3dzciIuLY8CAAcybN4/ExERef/11h2zXxmJtiL3bVbSNM/dNztIvgfRN1iB9k/U5U7/UVLwNcZa+qcMkOm5ubgwYMICUlBTzbUajkZSUlHrzC6+//no++eQT/va3v7Fs2TJ7hNqg0tJSMjIyCA8PN9/miLF26dKFsLCweu1cXFzM1q1b67UzwL333sv8+fO5/vrrW/wNhq3k5ORQWFhYr52hfWJVFIWZM2eycuVK1q5dS5cuXerdP2DAAFxdXeu17YEDB8jOzr6gbefPn8/UqVNJTk62yZtJc7E2xLTfwx/b1taxNsZoNFJVVeVQ7dpcrA1xtHYVLePMfZOz9EsgfVNbSN/Ufu+hztQvnR9vQxypXZtktzIINrBs2TLF3d1d+fDDD5W9e/cqd999t+Lv76/k5eUpilK/8slnn32meHh41Kt40Z4effRRJTU1VcnMzFQ2bdqkDB8+XAkODlby8/PtHmtJSYmSlpampKWlKYCycOFCJS0tzVzpZf78+Yq/v7/y1VdfKenp6cq4ceOULl26KBUVFYqiXFgt5rXXXlP0er2ycePGdo21pKREmTVrlrJ582YlMzNTWbNmjdK/f38lPj5eqaysbPdY7733XsXPz09JTU1VcnNzzZfy8nLzMffcc4/SuXNnZe3atcr27duVpKQkJSkpyXz/H6uaPPTQQ0poaKiyb9++do318OHDynPPPads375dyczMVL766iula9euyrBhw9o9VkVRlCeffFJZv369kpmZqaSnpytPPvmkotFolJ9++klRFMdp1+ZidbR2FdbhLH2TI/dLiiJ9k/RNztU3OVO/1Fy8jtSuLdWhEh1FUZTFixcrnTt3Vtzc3JTBgwcrW7ZsMd93/pu0oijK8uXLFQ8PD2XFihXtHufEiROV8PBwxc3NTYmMjFQmTpyoHD582CFiNf2x/vEydepURVHUMp7PPPOMEhoaqri7uyvJycnKgQMHzI//4xu0oijKq6++qvj4+CibNm1qt1jLy8uVkSNHKp06dVJcXV2VmJgY5a677jJ/uGjvWBuKE1A++OAD8zEVFRXKfffdpwQEBCheXl7K+PHjldzc3Ate7/mlGu+//34lPDy83u/A1rFmZ2crw4YNUwIDAxV3d3clLi5Oeeyxx5SzZ8+2e6yKoih33HGHEhMTo7i5uSmdOnVSkpOTzZ2JojhOuzYXq6O1q7AeZ+ibHLlfUhTpm6Rvcq6+yZn6pebidaR2bSmNoihKy8eBhBBCCCGEEMJxdZg1OkIIIYQQQghhIomOEEIIIYQQosORREcIIYQQQgjR4UiiI4QQQgghhOhwJNERQgghhBBCdDiS6AghhBBCCCE6HEl0hBBCCCGEEB2OJDpCCCGEEEKIDkcSHSGsZNq0adxwww32DkMIIYQApF8SQhIdIYQQQgghRIcjiY4QLfT555/Tr18/PD09CQoKYvjw4Tz22GN89NFHfPXVV2g0GjQaDampqQAcO3aMW265BX9/fwIDAxk3bhxZWVnm85m+cZs7dy6dOnXC19eXe+65h+rqavu8QCGEEE5F+iUhGuZi7wCEcCa5ublMmjSJBQsWMH78eEpKSti4cSO33XYb2dnZFBcX88EHHwAQGBiIwWBg1KhRJCUlsXHjRlxcXPjnP//J6NGjSU9Px83NDYCUlBQ8PDxITU0lKyuL22+/naCgIF544QV7vlwhhBAOTvolIRoniY4QLZCbm0tNTQ0TJkwgJiYGgH79+gHg6elJVVUVYWFh5uP/+9//YjQaee+999BoNAB88MEH+Pv7k5qaysiRIwFwc3NjyZIleHl50adPH5577jkee+wxnn/+ebRaGXgVQgjRMOmXhGic/KUK0QKJiYkkJyfTr18/br75Zt59913OnDnT6PG7du3i8OHD+Pj4oNfr0ev1BAYGUllZSUZGRr3zenl5ma8nJSVRWlrKsWPHbPp6hBBCODfpl4RonIzoCNECOp2O1atX88svv/DTTz+xePFinn76abZu3drg8aWlpQwYMIClS5decF+nTp1sHa4QQogOTvolIRoniY4QLaTRaLj00ku59NJLmT17NjExMaxcuRI3Nzdqa2vrHdu/f3+WL19OSEgIvr6+jZ5z165dVFRU4OnpCcCWLVvQ6/VER0fb9LUIIYRwftIvCdEwmbomRAts3bqVF198ke3bt5Odnc0XX3zBqVOn6NWrF7GxsaSnp3PgwAEKCgowGAxMmTKF4OBgxo0bx8aNG8nMzCQ1NZUHHniAnJwc83mrq6u588472bt3L99//z1z5sxh5syZMg9aCCFEk6RfEqJxMqIjRAv4+vqyYcMGFi1aRHFxMTExMbz66quMGTOGgQMHkpqaysCBAyktLWXdunVceeWVbNiwgSeeeIIJEyZQUlJCZGQkycnJ9b5JS05OJj4+nmHDhlFVVcWkSZN49tln7fdChRBCOAXpl4RonEZRFMXeQQjxZzZt2jSKior48ssv7R2KEEIIIf2S6DBk/FEIIYQQQgjR4UiiI4QQQgghhOhwZOqaEEIIIYQQosORER0hhBBCCCFEhyOJjhBCCCGEEKLDkURHCCGEEEII0eFIoiOEEEIIIYTocCTREUIIIYQQQnQ4kugIIYQQQgghOhxJdIQQQgghhBAdjiQ6QgghhBBCiA5HEh0hhBBCCCFEh/P/Oc1gelxD0+IAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 38
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Opl4iYQJ37UO"
      },
      "source": [
        "## 评估"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 39,
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-17T03:17:16.674099900Z",
          "start_time": "2024-07-17T03:17:14.333157800Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fAlq1qOp37UO",
        "outputId": "f4ae7ed3-2611-4879-86e9-8541863a040e"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3518\n",
            "accuracy: 0.8739\n"
          ]
        }
      ],
      "source": [
        "# dataload for evaluating\n",
        "\n",
        "model.eval() # 进入评估模式\n",
        "loss, acc = evaluating(model, val_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "XFs5poDhDCXB"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.7"
    },
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "3c401634e88f4fb5bf81a63bf1d001bf": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_5e8e9f79e65c45579ed692acbeb18e73",
              "IPY_MODEL_c753f913521f4b088f6aefbcdb793c13",
              "IPY_MODEL_4f1b7dec806146d6b0c96f7b6cdb7119"
            ],
            "layout": "IPY_MODEL_1748afc65cfb49b1b6fb437a507d7a0a"
          }
        },
        "5e8e9f79e65c45579ed692acbeb18e73": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_2f8f93c135ca441ba5c25ebae604c518",
            "placeholder": "​",
            "style": "IPY_MODEL_48c292b88a6a468fa3921dd765570057",
            "value": "100%"
          }
        },
        "c753f913521f4b088f6aefbcdb793c13": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_21c15ead02e24eafb7aec69c04745272",
            "max": 37500,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_95fae28812614cdd8f30f638e4d52137",
            "value": 37500
          }
        },
        "4f1b7dec806146d6b0c96f7b6cdb7119": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_e0f31116d4d84f178a08072156ed52ca",
            "placeholder": "​",
            "style": "IPY_MODEL_c8ce30a088ad4ad2a32ae27d27f3d10a",
            "value": " 37500/37500 [09:27&lt;00:00, 81.33it/s, epoch=19]"
          }
        },
        "1748afc65cfb49b1b6fb437a507d7a0a": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "2f8f93c135ca441ba5c25ebae604c518": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "48c292b88a6a468fa3921dd765570057": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "21c15ead02e24eafb7aec69c04745272": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "95fae28812614cdd8f30f638e4d52137": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "e0f31116d4d84f178a08072156ed52ca": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "c8ce30a088ad4ad2a32ae27d27f3d10a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}